C++ 从表达式中删除无效括号

c++server side programmingprogramming

给定一个括号序列;现在,您必须通过删除无效括号来打印所有可能的括号,例如

输入:str = “()())()” -
输出:()()() (())()
有两种可能的解决方案
"()()()" 和 "(())()"

输入:str = (v)())()
输出:(v)()() (v())()

在这个问题中,我们将使用回溯,以便打印所有有效序列。

寻找解决方案的方法

在这种方法中,我们将尝试使用 BFS 逐个删除左括号和右括号。现在,对于每个序列,我们检查它是否有效。如果有效,则将其打印为输出。

示例

 
#include <bits/stdc++.h>
using namespace std;
bool isParenthesis(char c){
    return ((c == '(') || (c == ')'));
}
bool validString(string str){
    // cout << str << " ";
    int cnt = 0;
    for (int i = 0; i < str.length(); i++){
        if (str[i] == '(')
           cnt++;
        else if (str[i] == ')')
           cnt--;
          if (cnt < 0)
           return false;
    }
    // cout << str << &" &";;
    return (cnt == 0);
}
void validParenthesesSequences(string str){
    if (str.empty())
        return ;
    set<string> visit; // 如果我们检查了该字符串,则将其放入 visit 中
                    // 这样我们就不会再次遇到该字符串
   queue<string> q; // 执行 bfs 的队列
    string temp;
    bool level;
    // 将给定的字符串作为起始节点推送到队列中
    q.push(str);
    visit.insert(str);
    while (!q.empty()){
        str = q.front(); q.pop();
        if (validString(str)){
        //    cout << &"s";
            cout << str << &";\n"; // 我们打印字符串
            level = true; // 因为我们在同一级别上找到了字符串,所以我们不需要从中应用 bfs
        }
        if (level)
            continue;
        for (int i = 0; i < str.length(); i++){
            if (!isParenthesis(str[i])) // 我们不会从字符串中删除括号以外的任何其他字符
              continue;
            temp = str.substr(0, i) + str.substr(i + 1); // 从字符串中逐个删除括号
            if (visit.find(temp) == visit.end()) { // 如果我们检查该字符串,则不会再次检查它
                  q.push(temp);
              visit.insert(temp);
            }
        }
      }
}
int main(){
    string s1;
    s1 = "(v)())()";
    cout << "输入:" << s1 << "\n";
    cout << "输出:";
    validParenthesesSequences(s1);
    return 0;
}

输出

输入:(v)())()
输出:(v())()

上述代码的解释

在上述方法中,我们只需逐个删除括号即可。现在,我们可以像删除括号一样删除括号。我们还会跟踪先前的序列,这样我们就不会检查相同的序列两次。现在,如果我们在所有可能性中找到一个有效序列,我们会打印所有有效可能性,这就是我们的程序的运行方式。

结论

在本教程中,我们解决了一个问题,即删除无效括号。我们还学习了这个问题的 C++ 程序以及我们解决这个问题的完整方法(正常)。我们可以用其他语言(如 C、java、python 和其他语言)编写相同的程序。我们希望本教程对您有所帮助。


相关文章