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を返します.つまり、合計スコアです.
コードは次のとおりです.
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;
    }
};*/