LeetCode856. 括弧の点数c++(最も詳しい考え方の解法!!)
1926 ワード
平衡括弧文字列Sが与えられ、以下の規則に従って文字列のスコアが計算される.
()1点をとる.ABはA+B点を得、AとBはバランス括弧文字列である.(A)は2*A点を得て、Aは平衡括弧文字列である.
例1:
入力:()出力:1例2:
入力:「()」出力:2例3:
入力:「()()」出力:2例4:
入力:「()()())」出力:6
ヒント:
Sは、バランス括弧文字列であり、(および)のみを含む.2 <= S.length <= 50
構想1:与えられたバランスカッコ文字列に対して、この文字列を遍歴すればint型変数count_を定義するleftは左括弧の個数を記録し、int型変数はcountで総点数を記録し、最初の要素から、‘(’,count_leftに1を加え、‘)’に出会ったらその前の要素が‘(’,もしそうであれば、説明は簡単な‘()’型か、‘(A)’型か、countに2^(count_left-1)を加え、count_leftは1を減らし、そうでなければ直接1を減らす.完全なシーケンスを巡回するまで.次にcountを返します.つまり、合計スコアです.
コードは次のとおりです.
考え方2:スタックで解決すると、左括弧に遭遇するとスタックに入ります.右かっこに遭遇した場合、スタックの上部が右かっこかどうかを判断し、もしそうであれば()と説明し、スタックを出て数字1を押す.そうでなければ(A)型と説明し、内部数字をすべて加算して再びスタックに入れます.最後にスタック内にはいろいろな数字が入っていて、加算すればいいです.
コードは次のとおりです.
()1点をとる.ABはA+B点を得、AとBはバランス括弧文字列である.(A)は2*A点を得て、Aは平衡括弧文字列である.
例1:
入力:()出力:1例2:
入力:「()」出力:2例3:
入力:「()()」出力:2例4:
入力:「()()())」出力:6
ヒント:
Sは、バランス括弧文字列であり、(および)のみを含む.2 <= S.length <= 50
構想1:与えられたバランスカッコ文字列に対して、この文字列を遍歴すればint型変数count_を定義するleftは左括弧の個数を記録し、int型変数はcountで総点数を記録し、最初の要素から、‘(’,count_leftに1を加え、‘)’に出会ったらその前の要素が‘(’,もしそうであれば、説明は簡単な‘()’型か、‘(A)’型か、countに2^(count_left-1)を加え、count_leftは1を減らし、そうでなければ直接1を減らす.完全なシーケンスを巡回するまで.次にcountを返します.つまり、合計スコアです.
コードは次のとおりです.
class Solution {
public:
int scoreOfParentheses(string S) {
int count = 0;
int count_left = 0;
for(int i = 0;i
考え方2:スタックで解決すると、左括弧に遭遇するとスタックに入ります.右かっこに遭遇した場合、スタックの上部が右かっこかどうかを判断し、もしそうであれば()と説明し、スタックを出て数字1を押す.そうでなければ(A)型と説明し、内部数字をすべて加算して再びスタックに入れます.最後にスタック内にはいろいろな数字が入っていて、加算すればいいです.
コードは次のとおりです.
/*class Solution {
public:
int scoreOfParentheses(string S) {
stack s;
for(char& i : S) {
if(i == '(') {
s.push("(");
} else {
if(!s.empty() && s.top() == "(") {
s.pop();
s.push("1");
} else {
int sum = 0;
while(!s.empty() && s.top() != "(") {
sum += stoi(s.top());
s.pop();
}
if(!s.empty()) {
s.pop();
}
s.push(to_string(sum * 2));
}
}
}
int res = 0;
while(!s.empty()) {
res += stoi(s.top());
s.pop();
}
return res;
}
};*/