Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results.
Note: The input string may contain letters other than the parentheses (
and )
.
Examples:
"()())()" -> ["()()()", "(())()"] "(a)())()" -> ["(a)()()", "(a())()"] ")(" -> [""]
Credits:
Special thanks to @hpplayer for adding this problem and creating all test cases.
思路:BFS。首先将s压入队列,循环取出队列头部的字符串,如果其合法,将其加入返回的数组ret中,并设置bool常量found为true。因为我们返回的是括号数目最多的合法字符串,如果found为true,表明找到了一个合法的字符串,后面的字符串没有必要进行切割处理了,所以found为true,直接continue跳过循环。否则尝试切割字符串中的一个左右括号,将其压入队列q中,后续判断其是否合法。注意,为了保证字符串不出现重复,这里用了unordered_map判断是否出现重复字符串,只有首次出现的字符串才会进入队列q中。
class Solution {
private:
bool isValid(string s){
int count=0;
for(int i=0;i<s.length();i++){
if(s[i]==‘(‘)
count++;
else if(s[i]==‘)‘){
if(count==0)
return false;
count--;
}
}
return count==0;
}
vector<string> ret;
public:
vector<string> removeInvalidParentheses(string s) {
unordered_map<string,int> map;
queue<string> q;
q.push(s);
map[s]=1;
bool found=false;
while(!q.empty()){
string str=q.front();
q.pop();
if(isValid(str)){
ret.push_back(str);
found=true;
}
if(found)
continue;
for(int i=0;i<str.length();i++){
if(str[i]!=‘)‘&&str[i]!=‘(‘)
continue;
//将这个括号从字符串中去除
string sub=str.substr(0,i)+str.substr(i+1);
if(map.find(sub)==map.end()){
q.push(sub);
map[sub]=1;
}
}
}
return ret;
}
};
时间: 2024-11-04 19:01:23