Remove Invalid Parentheses
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())()"]
")(" -> [""]
解析:
类似于按层遍历二叉树,每次查看队列中相同长度的字符串看是否有符合要求的,有的话判断结束,没有的话,把字符串长度减1的串进队列,
代码:
class Solution {
public:
bool valid(string s)
{
if (s.empty()) return true;
int count=0;
for (int i=0; i<s.size(); i++)
{
if ((s[i]!='(')&&(s[i]!=')'))
continue;
if (s[i]=='(')
count++;
else
{
count--;
if (count<0)
break;
}
}
if (count==0)
{
return true;
}
else
return false;
}
vector<string> removeInvalidParentheses(string s) {
vector<string>ans;
if (s.size()==0)
{
ans.push_back(s);
return ans;
}
queue<string>que;
que.push(s);
unordered_map<string,int>vis;
vis[s]=1;
while(!que.empty())
{
int cnt=que.size();
for (int i=0; i<cnt; i++)
{
string temp=que.front();
if (valid(temp))
{
ans.push_back(temp);
}
que.pop();
for (int j=0; j<temp.size(); j++)
{
if (!vis[temp.substr(0,j)+temp.substr(j+1)])
{
vis[temp.substr(0,j)+temp.substr(j+1)]++;
que.push(temp.substr(0,j)+temp.substr(j+1));
}
}
}
if (!ans.empty())
return ans;
}
return ans;
}
};