美文网首页
移除无效的括号

移除无效的括号

作者: WAI_f | 来源:发表于2020-07-22 23:17 被阅读0次

    题目:

    给你一个由 '('、')' 和小写字母组成的字符串 s。
    你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。
    请返回任意一个合法字符串。
    有效「括号字符串」应当符合以下 任意一条 要求:

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

    示例:

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

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

    解题方法:

    • 创建一个stack,用来存储'('在字符串s中的下标;
    • 遍历字符串s,如果是'(',stack中记录下标;如果是')',需要判断stack内是否有'(',如果stack是空的,说明这个')'是多余的,把s中对应位置设置城'*',反之说明还有'('可以与之匹配,则弹出stack顶端的元素。
    • 完成s的遍历以后,还要判断stack是不是空的,因为'('也可能有多余的,将stack中存储的下标取出,将s对应位置设置成'*'。
    • 遍历s,将非'*'元素存进新的字符串中。

    代码和结果:

    class Solution {
    public:
        string minRemoveToMakeValid(string s) {
            string srev;
            stack<int> idx;
            for(int i=0;i<s.size();i++)
            {
                if(s[i]=='(')
                {
                    idx.push(i);
                }
                else if(s[i]==')')
                {
                    if(idx.empty())
                        s[i]='*';
                    else
                        idx.pop();
                }
            }
    
            while(!idx.empty())
            {
                s[idx.top()]='*';
                idx.pop();
            }
    
            for(int i=0;i<s.size();i++)
            {
                if(s[i]!='*')
                    srev.push_back(s[i]);
            }
    
            return srev;
        }
    };
    
    运行结果:

    原题链接:https://leetcode-cn.com/problems/minimum-remove-to-make-valid-parentheses/

    相关文章

      网友评论

          本文标题:移除无效的括号

          本文链接:https://www.haomeiwen.com/subject/ojpxlktx.html