zoukankan      html  css  js  c++  java
  • 301 Remove Invalid Parentheses 删除无效的括号

    删除最小数目的无效括号,使输入的字符串有效,返回所有可能的结果。
    注意: 输入可能包含了除 ( 和 ) 以外的元素。
    示例 :
    "()())()" -> ["()()()", "(())()"]
    "(a)())()" -> ["(a)()()", "(a())()"]
    ")(" -> [""]
    详见:https://leetcode.com/problems/remove-invalid-parentheses/description/

    方法一:

    class Solution {  
    public:  
        vector<string> removeInvalidParentheses(string s) {  
            vector<string> ans; 
            helperDFS(s, ')', 0,ans);  
            return ans;  
        }  
        void helperDFS(string s, char ch, int last,vector<string> &ans)  
        {  
            for(int i = 0, cnt = 0; i < s.size(); i++)  
            {  
                if(s[i]=='('||s[i]==')')
                {
                    s[i]==ch?cnt++:cnt--; 
                }
                if(cnt <= 0)
                {
                    continue;  
                }
                for(int j = last; j <= i; j++)  
                {  
                    if(s[j] == ch && (j ==last || s[j-1]!= ch))  
                    {
                        helperDFS(s.substr(0, j)+s.substr(j+1), ch, j,ans);  
                    }
                }  
                return;  
            }  
            reverse(s.begin(), s.end());  
            if(ch == ')')
            {
                return helperDFS(s, '(', 0,ans);  
            }
            ans.push_back(s);  
        }  
    };  
    

     方法二:

    class Solution {
    public:
        vector<string> removeInvalidParentheses(string s) {
            vector<string> res;
            unordered_set<string> visited{{s}};
            queue<string> q{{s}};
            bool found = false;
            while (!q.empty())
            {
                string t = q.front();
                q.pop();
                if (isValid(t)) 
                {
                    res.push_back(t);
                    found = true;
                }
                if (found)
                {
                    continue;
                }
                for (int i = 0; i < t.size(); ++i) 
                {
                    if (t[i] != '(' && t[i] != ')')
                    {
                        continue;
                    }
                    string str = t.substr(0, i) + t.substr(i + 1);
                    if (!visited.count(str)) 
                    {
                        q.push(str);
                        visited.insert(str);
                    }
                }
            }
            return res;
        }
        bool isValid(string t) {
            int cnt = 0;
            for (int i = 0; i < t.size(); ++i) 
            {
                if (t[i] == '(')
                {
                    ++cnt;
                }
                else if (t[i] == ')' && --cnt < 0)
                {
                    return false;
                }
            }
            return cnt == 0;
        }
    };
    

     参考:https://blog.csdn.net/qq508618087/article/details/50408894

    https://www.cnblogs.com/grandyang/p/4944875.html

  • 相关阅读:
    不同的ospf进程发布互联网段可以互通
    大数分解
    主席树(非权值)
    块状数组
    Codeforces Round #744 (Div. 3) G. Minimal Coverage
    记录一种从天而降的掌法(动态维护中位数的方法)
    快速统计二进制中1的数量
    网络流(小常数)
    矩阵快速幂
    米勒罗宾素性检验
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8781578.html
Copyright © 2011-2022 走看看