力扣刷题:24-移除无效的括号(1249)

242 阅读1分钟

有效的括号首先是左右括号的数量相等,再就是左括号一定先出现(在左边),这个可以使用一个变量来计数,出现做括号加一,出现右括号减一,当变量等于-1时,一定是多出了一个有括号,删除它,如果所有括号处理完了,发现这个变量不等于0,说明多出了左括号,再重新处理一遍做括号即可。

下面是C++语言实现的代码:

class Solution {
public:
    string minRemoveToMakeValid(string s) {
        string ret = "";
        int pre = 0, cnt = 0;
        for (int i = 0; i < s.length(); i++) {
            switch (s[i]) {
            case '(':
                cnt ++;
                break;
            case ')':
                cnt --;
                break;
            }
            if (cnt == -1) {
                ret += s.substr(pre, i - pre);
                cnt = 0;
                pre = i + 1;
            }
        }
        ret += s.substr(pre, s.size() - pre);
        if (cnt == 0) {
            return ret;
        }

        s = ret;
        ret = "";
        pre = s.length() - 1;
        cnt = 0;
        for (int i = pre; i >= 0; i--) {
            switch (s[i]) {
            case '(':
                cnt --;
                break;
            case ')':
                cnt ++;
                break;
            }
            if (cnt == -1) {
                ret = s.substr(i + 1, pre - i) + ret;
                cnt = 0;
                pre = i - 1;
            }
        }
        ret = s.substr(0, pre + 1) + ret;
        return ret;
    }
};