求解有多个结果的组合问题时,首先想到暴搜,如果不行,那就加上memorization剪枝(感觉和dp有点像,都是通过记录并查询中间变量来减少计算的)
这道题还有一个需要注意的地方:bfs下降过程中,第一次找到合法的括号组合就不在进行bfs计算了,因为我们不想找到 "()()", "()" 这样的后一个比前一个小的结果
第一次找到合法的括号组合后,剩下的工作就是做valid check了。
memorization剪枝是通过哈希表实现的
class Solution {
public:
vector<string> removeInvalidParentheses(string s) {
vector<string> res;
unordered_map<string, int> visited;
queue<string> q;
q.push(s);
++visited[s];
bool found = false;
while (!q.empty()) {
s = q.front(); q.pop();
if (isValid(s)) {
res.push_back(s);
found = true;
//continue;
}
if (found) continue;
for (int i = 0; i < s.size(); ++i) {
if (s[i] != '(' && s[i] != ')') continue;
string t = s.substr(0, i) + s.substr(i + 1);
if (visited.find(t) == visited.end()) {
q.push(t);
++visited[t];
}
}
}
return res;
}
bool isValid(string t) {
int cnt = 0;
for (int i = 0; i < t.size(); ++i) {
if (t[i] == '(') ++cnt;
if (t[i] == ')' && cnt-- == 0) return false;
}
return cnt == 0;
}
};