最小删除以在C ++中制作有效的括号

假设我们有一个字符串s'(',')'和小写英文字符。我们必须删除最小括号(在任何位置的'('或')'),以便得到的括号字符串有效并返回任何有效字符串。当满足所有这些条件时,括号字符串有效-

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

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

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

因此,如果输入类似于“ a)b(c)d”,那么输出将为“ ab(c)d”

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

  • 定义一个堆栈st

  • 对于范围从0到s的i

    • 如果堆栈不为空,则从堆栈弹出,否则s [i] ='*'

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

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

    • 虽然st不为空,

      • s [堆栈的顶部元素] ='*'

      • 从堆栈弹出

    • ans:=空字符串

    • 当我的范围是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