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代替的话,答案是可以的,我没有太确定这样行不行,没有太想通,代码就不放了。

评论区还有不少好的答案,这里暂时没看,下次去看看。

posted @ 2019-09-17 16:41  于老师的父亲王老爷子  阅读(17)  评论(0编辑  收藏  举报