zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
     
     
  • 相关阅读:
    GO语言常用标准库03---time包
    GO语言常用标准库02---os包
    GO语言常用标准库01---strings包
    GO语言复合类型05---递归
    GO语言练习---对切片进行排序
    GO语言复合类型04---映射
    GO语言复合类型03---切片
    GO语言复合类型02---数组
    [踩坑记录] windows10 应用商店打不开 代码: 0x80131500
    [Linux kali] Kali KDE桌面安装中文输入法 不能登录系统
  • 原文地址:https://www.cnblogs.com/zhoudayang/p/5024435.html
Copyright © 2011-2022 走看看