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

移除无效的括号

作者: 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