ホームページ >バックエンド開発 >C++ >C++は式から無効な括弧を削除します

C++は式から無効な括弧を削除します

王林
王林転載
2023-09-04 13:33:12914ブラウズ

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

与えられた括弧シーケンス; 次に、無効な括弧を削除することで作成できるすべての括弧を出力する必要があります。たとえば、

Input : str = “()())()” -
Output : ()()() (())()
There are two possible solutions
"()()()" and "(())()"

Input : str = (v)())()
Output : (v)()() (v())()

この質問では、バックトラッキングメソッドを使用して、すべての有効なシーケンスを出力します。

解決方法

この方法では、BFS を使用して開き括弧と閉じ括弧を 1 つずつ削除してみます。次に、シーケンスごとにそれが有効かどうかを確認します。有効な場合は、出力として印刷します。

 
#include <bits/stdc++.h>
using namespace std;
bool isParenthesis(char c){
    return ((c == &#39;(&#39;) || (c == &#39;)&#39;));
}
bool validString(string str){
    // cout << str << " ";
    int cnt = 0;
    for (int i = 0; i < str.length(); i++){
        if (str[i] == &#39;(&#39;)
           cnt++;
        else if (str[i] == &#39;)&#39;)
           cnt--;
        if (cnt < 0)
           return false;
    }
    // cout << str << " ";
    return (cnt == 0);
}
void validParenthesesSequences(string str){
    if (str.empty())
        return ;
    set<string> visit; // if we checked that sting so we put it inside visit
                      // so that we will not encounter that string again
    queue<string> q; // queue for performing bfs
    string temp;
    bool level;
    // pushing given string as starting node into queue
    q.push(str);
    visit.insert(str);
    while (!q.empty()){
        str = q.front(); q.pop();
        if (validString(str)){
        //    cout << "s";
            cout << str << "\n"; // we print our string
            level = true; // as we found the sting on the same level so we don&#39;t need to apply bfs from it
        }
        if (level)
            continue;
        for (int i = 0; i < str.length(); i++){
            if (!isParenthesis(str[i])) // we won&#39;t be removing any other characters than the brackets from our string
                continue;
            temp = str.substr(0, i) + str.substr(i + 1); // removing parentheses from the strings one by one
            if (visit.find(temp) == visit.end()) { // if we check that string so we won&#39;t check it again
                q.push(temp);
                visit.insert(temp);
            }
        }
    }
}
int main(){
    string s1;
    s1 = "(v)())()";
    cout << "Input : " << s1 << "\n";
    cout << "Output : ";
    validParenthesesSequences(s1);
    return 0;
}

出力

Input : (v)())()
Output : (v())()

上記コードの説明

上記のメソッドでは、括弧を1つずつ削除し、追跡も行います。同じシーケンスを繰り返しチェックすることを避けるために、前のシーケンスを削除します。有効なシーケンスが見つかった場合は、すべての有効な可能性を出力します。これがプログラムの実行方法です。

結論

このチュートリアルでは、無効な括弧を見つけて削除するという問題を解決しました。また、この問題を解決するための C プログラムと完全な解決策 (一般的な方法) も学びました。同じプログラムを C、Java、Python などの他の言語で書くことができます。このチュートリアルがお役に立てば幸いです。

以上がC++は式から無効な括弧を削除しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。