C++中最小删除以使括号有效


假设我们有一个包含 '('、')' 和小写英文字母的字符串 s。我们必须删除最少数量的括号( '(' 或 ')',位于任何位置),以便生成的括号字符串有效,并返回任何有效的字符串。当满足所有这些条件时,括号字符串才有效:

  • 它是空字符串,仅包含小写字符,或者

  • 它可以写成 AB 的形式(A 与 B 连接),其中 A 和 B 是有效的字符串,或者

  • 它可以写成 (A) 的形式,其中 A 是有效的字符串。

因此,如果输入类似于“a)b(c)d”,则输出将是“ab(c)d”。

为了解决这个问题,我们将遵循以下步骤:

  • 定义一个栈 st

  • 对于 i 从 0 到 s 的大小

    • 如果 s[i] = ‘(’,则将 i 插入 st

    • 否则,当 s[i] 为 ‘)’ 时,

      • 如果栈不为空,则从栈中弹出,否则 s[i] = ‘*’

  • 当 st 不为空时,

    • s[栈顶元素] = ‘*’

    • 从栈中弹出

  • ans := 空字符串

  • 对于 i 从 0 到 s 的大小 - 1

    • 如果 s[i] 不为 ‘*’,则 ans := ans + s[i]

  • 返回 ans

让我们看下面的实现来更好地理解:

示例

实时演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string minRemoveToMakeValid(string s) {
      stack <int> st;
      for(int i = 0; i < s.size(); i++){
         if(s[i] == '(')st.push(i);
         else if(s[i] == ')'){
            if(!st.empty())st.pop();
            else s[i] = '*';
         }
      }
      while(!st.empty()){
         s[st.top()] = '*';
         st.pop();
      }
      string ans = "";
     for(int i = 0; i < s.size(); i++){
        if(s[i] != '*')ans += s[i];
      }
      return ans;
   }
};
main(){
   Solution ob;
   cout << (ob.minRemoveToMakeValid("a)b(c)d"));
}

输入

"a)b(c)d"

输出

ab(c)d

更新于:2020年5月2日

383 次查看

启动您的职业生涯

通过完成课程获得认证

开始
广告