[アルゴリズム]プログラマかっこの変換


このブログは、非商業的な学業のためにのみ投稿されています.

1.問題分析


これは
  • 等化形態の正確な括弧を生じる問題である.
  • でも4-4~4-5は一度しかできないので、結果的には正しい文字列ではない場合があります.
  • 2.回答プロセス(挿入)

  • 文字列ライブラリの処理に詳しくありません.
  • を多く使って、使い方をマスターします.
  • 3.トラブルシューティング

  • の条件に従ってコードを順次作成します.
  • 再帰関数で実現され、バランスカッコ(u)と正しいカッコ(isPerfect)を取得する関数がそれぞれ作成される.
  • 4.コード

    #include <string>
    #include <vector>
    #include <utility>
    
    using namespace std;
    
    string getU(string s)
    {
        string u(s, 0, 1);
        int open = (u == "("), close = !open;
        
        for(int i = 1; i < s.length(); i++)
        {
            u += s[i];
            open += s[i] == '(';
            close += s[i] == ')';
            if(open == close)
                return u;
        }
    }
    
    bool isPerfect(string s)
    {
        int check = 0;
        for(int i = 0; i < s.length(); i++)
        {
            check += s[i] == '(';
            check -= s[i] == ')';
            if(check < 0)
                return false;
        }
        
        return true;
    }
    
    string reverseBracket(string s)
    {
        for(int i = 0; i < s.length(); i++)
            s[i] = (s[i] == ')') ? '(' : ')';
        return s;
    }
    
    string getUV(string s)
    {
        if(s == "")
            return s;
        
        string u = getU(s);
        string v(s, u.length(), s.length() - u.length());
        if(isPerfect(u))
        {
            v = getUV(v);
            return u + v;
        }
        else
            return "(" + getUV(v) + ")" + reverseBracket(u.substr(1, u.length() - 2));
    }
    
    string solution(string p) {
        string answer = getUV(p);
    
        return answer;
    }

    5.学習の達人のコード

  • コードは簡潔に見えます.
  • 文字列を分けるのも変数であるため、再帰関数自体が関数であるため、再帰処理を用いる.
  • というコードのほかに、私のように関数として単独で実現するものもあり、関数名から見ると、問題に基づいて名前を付ける必要がある.
  • isBalance(), isCorrect() ...
  • #include <bits/stdc++.h>
    using namespace std;
    
    bool check(const string &a) {
        int r = 0;
        for (char ch : a) {
            if (ch == '(') ++r;
            else --r;
            if (r < 0) return false;
        }
        return r == 0;
    }
    string solution(string p) {
        if (p == "") return "";
        if (check(p)) return p;
    
        int i, t = 0;
        for (i = 0; i < p.size(); ++i) {
            if (p[i] == '(') ++t;
            else --t;
            if (t == 0) break;
        }
    
        string u = p.substr(0, i + 1);
        string v = p.substr(i + 1);
    
        if (check(u)) return u + solution(v);
    
        for (char &ch : u) ch = ch == '(' ? ')' : '(';
        return string("(") + solution(v) + ")" + u.substr(1, u.size() - 2);
    }