Monday, October 2, 2023

Leetcode 1249. Minimum Remove to Make Valid Parentheses

 Valid Parentheses这个系列如果熟悉的话就知道非法的右括号‘)’是很容易分辨的,可以用栈也可以用简单计数找出。困难的地方在于左括号‘(’是没法在当时判定是否合法的。那么我们就需要记录下所有的左括号位置,当match的时候划掉合法的左括号,最后剩下的就是非法的。

这个题还有个不容易想到的方法,既然右括号很容易辨别合法性,我们可以反转字符串然后用同样的方法判定左括号。这样可以做到O(1)空间复杂度。这里贴上这种算法的代码。


class Solution {
public:
    string minRemoveToMakeValid(string s) {
        string s1 = buildString(s, '(',')');
        reverse(s1.begin(), s1.end());
        string s2 = buildString(s1, ')','(');
        reverse(s2.begin(), s2.end());
        return s2;
    }

    string buildString(string s, char open, char close){
        int count=0;
        string res="";
        for(int i=0; i<s.size(); i++){
            if(s[i]==open){
                count++;
            }else if(s[i]==close){
                if(count==0){
                    continue;
                }
                count--;
            }
            res+=s[i];
        }

        return res;
    } 
};

No comments:

Post a Comment

Leetcode 316. Remove Duplicate Letters

 这道题表面问的是如何删除重复,实际在问如何从多个字符选取一个保留,从而让整个字符串按升序排列。那么策略就是对于高顺位的字符比如‘a',就要选靠前位置的保留,而低顺位字符如’z'则应该尽量选取靠后位置保留。 算法大概思路:每看到一个字符,我们要决定是否保留 1. ...