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

posted on 2018-04-10 18:55  lina2014  阅读(321)  评论(0编辑  收藏  举报

导航