301. 刪除無效的括號
給你一個由若干括號和字母組成的字符串 s ,刪除最小數量的無效括號,使得輸入的字符串有效。
返回所有可能的結果。答案可以按 任意順序 返回。
- 示例 1:
輸入:s = “()())()”
輸出:["(())()","()()()"]
- 示例 2:
輸入:s = “(a)())()”
輸出:["(a())()","(a)()()"]
- 示例 3:
輸入:s = “)(”
輸出:[""]
提示:
- 1 <= s.length <= 25
- s 由小寫英文字母以及括號 ‘(’ 和 ‘)’ 組成
- s 中至多含 20 個括號
解題思路
使用廣度優先搜索,對上一次產生的字符串的每個括號,逐個嘗試刪除,每次bfs等于刪除一個括號,當出現合法的字符串時,就將其加入結果數組
代碼
class Solution {
public:vector<string> removeInvalidParentheses(string s) {vector<string> res;unordered_set<string> set;set.insert(s);while (true) {for (string t:set) {if (is_valid(t))res.push_back(t);}if (res.size() > 0)return res;unordered_set<string> new_set;for (string t:set) {for (int i = 0; i < t.length(); ++i) {if (t[i]=='('||t[i]==')')new_set.insert(t.substr(0,i)+t.substr(i+1));}}set=new_set;}return res;}bool is_valid(string s) {int l = 0;for (char c:s) {if (c == '(')l++;else if (c == ')')l--;if (l < 0)return false;}return l==0;}
};