最小删除以在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

    以上是 最小删除以在C ++中制作有效的括号 的全部内容, 来源链接: utcz.com/z/316837.html

    回到顶部