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