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