[アルゴリズム]プログラマかっこの変換
18513 ワード
このブログは、非商業的な学業のためにのみ投稿されています.
これは等化形態の正確な括弧を生じる問題である. でも4-4~4-5は一度しかできないので、結果的には正しい文字列ではない場合があります. 文字列ライブラリの処理に詳しくありません. を多く使って、使い方をマスターします. の条件に従ってコードを順次作成します. 再帰関数で実現され、バランスカッコ(u)と正しいカッコ(isPerfect)を取得する関数がそれぞれ作成される. コードは簡潔に見えます. 文字列を分けるのも変数であるため、再帰関数自体が関数であるため、再帰処理を用いる. というコードのほかに、私のように関数として単独で実現するものもあり、関数名から見ると、問題に基づいて名前を付ける必要がある. isBalance(), isCorrect() ...
1.問題分析
これは
2.回答プロセス(挿入)
3.トラブルシューティング
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.学習の達人のコード
#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);
}
Reference
この問題について([アルゴリズム]プログラマかっこの変換), 我々は、より多くの情報をここで見つけました https://velog.io/@fortice/알고리즘-프로그래머스괄호-변환テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol