1. 程式人生 > 其它 >Leetcode 301. 刪除無效的括號 困難 bfs

Leetcode 301. 刪除無效的括號 困難 bfs

301. 刪除無效的括號

題目:

給你一個由若干括號和字母組成的字串 s ,刪除最小數量的無效括號,使得輸入的字串有效。

返回所有可能的結果。答案可以按 任意順序 返回。

 

示例 1:

輸入:s = "()())()"
輸出:["(())()","()()()"]

 

思路:

刪除字串中的左右括號,使得字串有效。

有效的定義就是左括號數量始終大於等於右括號。且兩者總數目一致。

使用BFS,每次獲取當前層的所有可能,如果存在有效字串,則儲存結果並返回當前層所有有效結果。

每層只在之前的基礎上刪掉一個括號。

使用unordered_set來過濾重複結果。

class Solution {
public
: vector<string> removeInvalidParentheses(string s) { vector<string> ret; unordered_set<string> cur_set; cur_set.insert(s); while(!cur_set.empty()){ unordered_set<string> next_set; for(auto& str:cur_set){
if(isValid(str)){ ret.push_back(str); } } if(!ret.empty()){ return ret; } for(auto& str:cur_set){ for(int i=0;i<str.size();++i){ if(i>0&&str[i]==str[i-1
]) continue; string next=str.substr(0,i)+str.substr(i+1,str.size()); next_set.insert(next); } } cur_set=next_set; } return ret; } bool isValid(string s){ int left=0,right=0; for(auto& c:s){ if(c=='(') left++; else if(c==')') right++; if(right>left) return false; } return left==right; } };