C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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 == '(') || (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; // 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't need to apply bfs from it
        }
        if (level)
            continue;
        for (int i = 0; i < str.length(); i++){
            if (!isParenthesis(str[i])) // we won'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'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つずつ削除するだけで、前のシーケンスも追跡できるため、これらすべての可能性から有効なシーケンスが見つかった場合に、同じシーケンスを2回チェックすることはありません。 、すべての有効な可能性を印刷し、それがプログラムの進行方法です。

結論

このチュートリアルでは、問題を解決して無効な括弧を削除します。また、この問題のC ++プログラムと、この問題を解決するための完全なアプローチ(通常)についても学びました。同じプログラムを、C、java、python、その他の言語などの他の言語で作成できます。このチュートリアルがお役に立てば幸いです。


  1. C++でstd::stringからスペースを削除します

    このプログラムでは、C++でstd::stringからスペースを削除する方法を説明します。これを削除するには、remove()関数を使用します。このremove()関数を使用すると、イテレータの開始と終了を取得し、次にそのイテレータオブジェクトから削除される3番目の引数を取得します。 Input: A string "This is C++ Programming Language" Output: "ThisisC++ProgrammingLanguage" アルゴリズム Step 1: Get the string Step 2: Remove sp

  2. C#の特定の文字列からすべての重複を削除します

    これが文字列です。 string str = "ppqqrr"; 次に、Hashsetを使用して文字列をcharにマップします。これにより、文字列から重複する文字が削除されます。 var res = new HashSet<char>(str); 完全な例を見てみましょう- 例 using System; using System.Linq; using System.Collections.Generic; namespace Demo {    class Program {       static v