LeetCode:括号的分数

788 阅读1分钟

一、题目描述

二、思路分析

2.1 分析

自己看这题的都有点迷糊,一直在想 A 和 B 是啥。原来** A 和 B 也是平衡括号字符串**。看了别人的思路,其实这题也不难。首先定义一个存放整数的栈,用 0 标记左括号,如果是遇到左括号,直接将 0 入栈即可。如果遇到右括号且当前栈顶为 0 (左括号),就把 0 (左括号)出栈,并且将分数 1 入栈。否则的话说明当前栈顶不是左括号,将之前的分数累加起来,直到遇到左括号为止。遇到左括号时,将左括号弹出,把累加起来的分数乘以 2 放入栈中。重复以上操作,直到平衡字符串遍历完毕。此时栈剩下的只有分数了,累加起来即可。

2.2 图解

三、题解

class Solution {
    public int scoreOfParentheses(String S) {
        Stack<Integer> stack = new Stack<>();

        for (char ch : S.toCharArray()) {
            if (ch == '(') {  // 遇到左括号入栈,用0标记
                stack.push(0);
            } else {  // 遇到右括号
                if (stack.peek() == 0) {  // 当前栈顶为左括号,即() 得一分
                    stack.pop();    // 弹出原来的左括号
                    stack.push(1);  // 分数入栈
                } else {  // 栈顶不为左括号,即为 (ABC)的情况 得分为  (A + B + C)*2
                    int sum = 0;
                    while (stack.peek() != 0) {
                        sum += stack.pop();
                    }
                    stack.pop(); // 弹出左括号
                    stack.push(sum * 2);  // 放入分数
                }
            }
        }

        int score = 0;
        while (!stack.isEmpty()) {  // 栈内最后都是分数,没有括号了,求和即可
            score += stack.pop();
        }
        return score;
    }
}