1. 程式人生 > >leetcode 856 括號的分數

leetcode 856 括號的分數

給定一個平衡括號字串 S,按下述規則計算該字串的分數:

  • () 得 1 分。
  • AB 得 A + B 分,其中 A 和 B 是平衡括號字串。
  • (A) 得 2 * A 分,其中 A 是平衡括號字串。

 

示例 1:

輸入: "()"
輸出: 1

示例 2:

輸入: "(())"
輸出: 2

示例 3:

輸入: "()()"
輸出: 2

示例 4:

輸入: "(()(()))"
輸出: 6

 

提示:

  1. S
     是平衡括號字串,且只含有 ( 和 ) 。
  2. 2 <= S.length <= 50

很明顯,這一題可以用棧來解決。

我們把單獨一個左括號算作0分,遍歷字串S,遇到左括號就直接算0分進棧,遇到右括號,先判斷棧頂是否為0,即是否為左括號,是的話就說明這是一個‘()’,那麼可以將棧頂的0彈出,再壓1分進去,如果棧頂非0,則說明是'(AB)',那麼不斷地將棧頂的分數取出,直到棧頂是0,即左括號為止,然後將該0彈出,並將取出的分數乘2再壓棧。

最後遍歷棧,將所有的分數加起來就是最終的結果。

class Solution {
    public int scoreOfParentheses(String S) {
        Stack<Integer> s = new Stack<Integer>();
        for(int i=0;i<S.length();i++){
            if(S.charAt(i)=='('){
                s.push(0);
            }
            else{
                if(s.peek()!=0){
                    int tmp=0;
                    while(!s.empty()&&s.peek()!=0){
                        tmp+=s.peek();
                        s.pop();
                    }
                    s.pop();
                    s.push(2*tmp);
                }
                else{
                    s.pop();
                    s.push(1);
                }
            }
        }
        int res=0;
        while(!s.empty()){
            res += s.peek();
            s.pop();
        }
        return res;
    }
}