• LeetCode 301. Remove Invalid Parentheses


    原题链接在这里:https://leetcode.com/problems/remove-invalid-parentheses/

    题目:

    Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results.

    Note: The input string may contain letters other than the parentheses ( and ).

    Examples:

    "()())()" -> ["()()()", "(())()"]
    "(a)())()" -> ["(a)()()", "(a())()"]
    ")(" -> [""]
    

    题解:

    题目要求减少最小个数的非法括号,要求最小,就想到BFS.

    Queue 里加入 原来的string s, 循环中从queue中poll出来一个string. 每次减掉一个括号,若是合法了就加到res中,同时停止继续enqueue, 只把queue中现有的一个level检查了就好。

    若是没遇到合法的,就把str从头到尾减掉一个括号放回到queue中。

    检查是否合法用isValid. 这种写法不需要stack, 节省了空间。

    同时使用Set 来记录已经检查过的string, 检查过就不需要再次检查。

    Time Complexity: exponential. n = s.length(). Space: O(n).

    AC Java:

     1 public class Solution {
     2     public List<String> removeInvalidParentheses(String s) {
     3         List<String> res = new ArrayList<String>();
     4         if(s == null){
     5             return res;
     6         }
     7         
     8         LinkedList<String> que = new LinkedList<String>();
     9         HashSet<String> visited = new HashSet<String>(); //存储已经检查过的string, 没有必要重复检查
    10         que.add(s);
    11         visited.add(s);
    12         boolean found = false; //标签,检查是否找到了valid parentheses
    13         
    14         while(!que.isEmpty()){
    15             String str = que.poll();
    16             if(isValid(str)){
    17                 res.add(str);
    18                 found = true;
    19             }
    20             if(found){      //已经找到,就在本level中找剩下的就好了
    21                 continue;
    22             }
    23             for(int i = 0; i<str.length(); i++){
    24                 if(str.charAt(i) != '(' && str.charAt(i) != ')'){
    25                     continue;
    26                 }
    27                 String newStr = str.substring(0,i) + str.substring(i+1);
    28                 if(!visited.contains(newStr)){
    29                     que.add(newStr);
    30                     visited.add(newStr);
    31                 }
    32             }
    33         }
    34         return res;
    35     }
    36     
    37     private boolean isValid(String s){
    38         int count = 0;
    39         for(int i = 0; i<s.length(); i++){
    40             if(s.charAt(i) == '('){
    41                 count++;
    42             }
    43             if(s.charAt(i) == ')'){
    44                 if(count == 0){
    45                     return false;
    46                 }else{
    47                     count--;
    48                 }
    49             }
    50         }
    51         return count == 0;
    52     }
    53 }

    类似Minimum Remove to Make Valid Parentheses.

  • 相关阅读:
    SQLServer性能杀手
    SqlServer内存瓶颈分析SQLServer:Buffer Manager
    HTML5变化 (一)
    对于using嵌套的改进
    String.IsNullOrEmpty()和String.IsNullOrWhiteSpace()
    querySelector & querySelectorAll
    Action<T> 委托
    Func<T, TResult>
    SL4.背景图片拖动
    JavaScript日志
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/4961186.html
Copyright © 2020-2023  润新知