移除无效括号

给你一个由 '('、')' 和小写字母组成的字符串 s。

你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。

请返回任意一个合法字符串。

有效「括号字符串」应当符合以下 任意一条 要求:

空字符串或只包含小写字母的字符串
可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」
可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」
 

示例 1:

输入:s = "lee(t(c)o)de)"
输出:"lee(t(c)o)de"
解释:"lee(t(co)de)" , "lee(t(c)ode)" 也是一个可行答案。
示例 2:

输入:s = "a)b(c)d"
输出:"ab(c)d"
示例 3:

输入:s = "))(("
输出:""
解释:空字符串也是有效的
示例 4:

输入:s = "(a(b(c)d)"
输出:"a(b(c)d)"
 

提示:

1 <= s.length <= 10^5
s[i] 可能是 '('、')' 或英文小写字母

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-remove-to-make-valid-parentheses

思路很简单,但是吐槽一下他的编译系统,我用string ss=ss+s[i],string s的长度是10^5,愣是给我搞成内存超限,代码调到我怀疑人生

后来改成ss.push_back(s[i]) 就通过了。。。。。。。。。。。。。。。。。

string minRemoveToMakeValid(string s)
{
    stack<int>p;
    string ss;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='(')
            p.push(i);

        else if(s[i]==')')
        {
            if(!p.empty())
                p.pop();
            else
                s[i]='#';
            
        }
    }
    while(!p.empty())//删除多余的左括号
    {
        s[p.top()]='#';
        p.pop();
    }

    for(int i=0;i<s.size();i++)
    {
        if(s[i]!='#')
            ss.push_back(s[i]);
    }
    return ss;

}

猜你喜欢

转载自www.cnblogs.com/-citywall123/p/12498371.html
今日推荐