Problem :
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 ).
Example:
"()())()" -> ["()()()", "(())()"]
"(a)())()" -> ["(a)()()", "(a())()"]
")(" -> [""]
**
Algorithm:
**
以初始串作为根节点做广搜,每次判断当前串是否是合法的,如果合法,就说明已经找到了,但是要注意要求返回的是所有的去掉最少括号的得到的合法的串,也就是说所有的返回的所有的合法串都在树种应该是在同一个高度。因此这个题用广搜应该会比深搜快一点。
**
Code:
class Solution {
public:
bool isvalid(string s)
{
int n=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='(')
n++;
if(s[i]==')')
{
if(n--==0)
return false;
}
}
return n==0;
}
vector<string> removeInvalidParentheses(string s) {
queue<string> q;
q.push(s);
vector<string> r;
map<string,bool> hash;
hash[s]=true;bool found = false;
while(!q.empty())
{
string x=q.front();q.pop();
if (isvalid(x))
{
r.push_back(x); found = true;
}
if (found)
continue;
for(int i=0;i<x.size();i++)
{
if(x[i]!='('&&x[i]!=')')
continue;
string temp=x.substr(0,i)+x.substr(i+1);
if(hash.find(temp)==hash.end())
{
q.push(temp);
hash[temp]=true;
}
}
}
return r;
}
};