• 301.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())()"]
    ")(" -> [""]
    

     

    Credits:
    Special thanks to @hpplayer for adding this problem and creating all test cases.

    思路:BFS。首先将s压入队列,循环取出队列头部的字符串,如果其合法,将其加入返回的数组ret中,并设置bool常量found为true。因为我们返回的是括号数目最多的合法字符串,如果found为true,表明找到了一个合法的字符串,后面的字符串没有必要进行切割处理了,所以found为true,直接continue跳过循环。否则尝试切割字符串中的一个左右括号,将其压入队列q中,后续判断其是否合法。注意,为了保证字符串不出现重复,这里用了unordered_map判断是否出现重复字符串,只有首次出现的字符串才会进入队列q中。

    class Solution {
    private:
        bool isValid(string s){
            int count=0;
            for(int i=0;i<s.length();i++){
                if(s[i]=='(')
                    count++;
                else if(s[i]==')'){
                    if(count==0)
                        return false;
                    count--;
                }
            }
            return count==0;
        }
        vector<string> ret;
    public:
        vector<string> removeInvalidParentheses(string s) {
            unordered_map<string,int> map;
            queue<string> q;
            q.push(s);
            map[s]=1;
            bool found=false;
            while(!q.empty()){
                string str=q.front();
                q.pop();
                if(isValid(str)){
                    ret.push_back(str);
                    found=true;
                }
                if(found)
                    continue;
                for(int i=0;i<str.length();i++){
                    if(str[i]!=')'&&str[i]!='(')
                        continue;
                    //将这个括号从字符串中去除
                    string sub=str.substr(0,i)+str.substr(i+1);
                    if(map.find(sub)==map.end()){
                        q.push(sub);
                        map[sub]=1;
                    }
                }
            }
            return ret;
        }
    };
    
     
     
  • 相关阅读:
    java 泛型 类型作为参量 Class<T> transform
    面向对象的类方法只具有命名空间的作用
    编程语言沉思录—编程语言的体系结构
    类型约束的作用
    函数重载、多态与型变
    函数类型与型变
    型变(逆变)函数
    scala 型变
    泛型编程的几个关键概念
    泛型是包含类型参数的抽象类型—类型构造器
  • 原文地址:https://www.cnblogs.com/zhoudayang/p/5024435.html
Copyright © 2020-2023  润新知