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

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

输入 : str = “()())()” -

输出 : ()()() (())()

There are two possible solutions

"()()()" and "(())()"

输入 : 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; // 如果我们检查那个刺,所以我们把它放在访问中

                      // 这样我们就不会再遇到那个字符串

    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++ 程序以及解决此问题的完整方法(Normal)。我们可以用其他语言编写相同的程序,例如 C、java、python 和其他语言。我们希望本教程对您有所帮助。

以上是 C++ 从表达式中删除无效的括号 的全部内容, 来源链接: utcz.com/z/362179.html

回到顶部