301. Remove Invalid Parentheses
这一题主要还是想要告诉自己:
做难题的时候,相信自己的思路,就算知道自己的是笨方法,也要坚持写下去(这在面试中是很有用的,直接写出最优的反而会被认为是做过这道题),就算TLE,大不了最后优化,总比什么都写不出来好。
主要思路:
遇到(,可以要可以不要;
遇到),如果此时leftRem(累计的(的数量)为0,则不能要;否则,可以要可以不要;
其他情况,都得要。
这是最初一版的代码,时间较长,但是还是说服自己写了下去:
class Solution {
public:
vector<string> removeInvalidParentheses(string s) {
set<string> ret;
int minCnt = INT_MAX;
helper(s, 0, ret, minCnt, "", 0, 0);
return vector<string>(ret.begin(), ret.end());
}
private:
void helper(string& s, int idx, set<string>& ret, int& minCnt, string temp, int cnt, int leftRem) {
if (idx == s.size()) {
if (leftRem == 0) {
if (cnt > minCnt)
return;
else if (cnt == minCnt)
ret.insert(temp);
else {
ret.clear();
minCnt = cnt;
ret.insert(temp);
}
}
return;
}
//for (int i = idx; i < s.size(); ++i) {
int i = idx;
if (s[i] == '(') {
helper(s, i+1, ret, minCnt, temp+'(', cnt, leftRem+1);
helper(s, i+1, ret, minCnt, temp, cnt+1, leftRem);
} else if (s[i] == ')') {
if (leftRem == 0)
helper(s, i+1, ret, minCnt, temp, cnt+1, leftRem);
else {
helper(s, i+1, ret, minCnt, temp, cnt+1, leftRem);
helper(s, i+1, ret, minCnt, temp+')', cnt, leftRem-1);
}
} else
helper(s, i+1, ret, minCnt, temp+s[i], cnt, leftRem);
//}
}
};
然后处理一下常见的导致重复答案的情况:几个(或者)连在一起的情况。
class Solution {
public:
vector<string> removeInvalidParentheses(string s) {
set<string> ret;
int minCnt = INT_MAX;
vector<bool> used(s.size(), false);
helper(s, 0, ret, minCnt, "", 0, 0, used);
return vector<string>(ret.begin(), ret.end());
}
private:
void helper(string& s, int idx, set<string>& ret, int& minCnt, string temp, int cnt, int leftRem, vector<bool>& used) {
if (idx == s.size()) {
if (leftRem == 0) {
if (cnt > minCnt)
return;
else if (cnt == minCnt)
ret.insert(temp);
else {
ret.clear();
minCnt = cnt;
ret.insert(temp);
}
}
return;
}
//for (int i = idx; i < s.size(); ++i) {
int i = idx;
if (s[i] == '(') {
if (i > 0 && s[i-1] == '(' && !used[i-1])
helper(s, i+1, ret, minCnt, temp, cnt+1, leftRem, used);
else {
used[i] = true;
helper(s, i+1, ret, minCnt, temp+'(', cnt, leftRem+1, used);
used[i] = false;
helper(s, i+1, ret, minCnt, temp, cnt+1, leftRem, used);
}
} else if (s[i] == ')') {
if (leftRem == 0)
helper(s, i+1, ret, minCnt, temp, cnt+1, leftRem, used);
else {
if (i > 0 && s[i-1] == ')' && !used[i-1])
helper(s, i+1, ret, minCnt, temp, cnt+1, leftRem, used);
else {
helper(s, i+1, ret, minCnt, temp, cnt+1, leftRem, used);
used[i] = true;
helper(s, i+1, ret, minCnt, temp+')', cnt, leftRem-1, used);
used[i] = false;
}
}
} else
helper(s, i+1, ret, minCnt, temp+s[i], cnt, leftRem, used);
//}
}
};
这就写的很乱了,但是优化效果很显著。
此时我不用set,直接用vector代替的话,答案是可以的,我没有太确定这样行不行,没有太想通,代码就不放了。
评论区还有不少好的答案,这里暂时没看,下次去看看。