给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
() 得 1 分。
AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
(A) 得 2 * A 分,其中 A 是平衡括号字符串。
示例 1:
输入: "()"
输出: 1
示例 2:
输入: "(())"
输出: 2
示例 3:
输入: "()()"
输出: 2
示例 4:
输入: "(()(()))"
输出: 6
题解的解法参考于官方的题解,将括号字符串理解为深度,例如,字符串 (()(.())) 中的 . 的深度为 2,因为它外侧嵌套了 2 层括号:(__(.__))。我们用一个栈来维护当前所在的深度,以及每一层深度的得分。当我们遇到一个左括号 ( 时,我们将深度加一,并且新的深度的得分置为 0。当我们遇到一个右括号 ) 时,我们将当前深度的得分乘二并加到上一层的深度。这里有一种例外情况,如果遇到的是 (),那么只将得分加一。
具体代码实现如下:
class Solution{
public int scoreOfParentheses(String S) {
Stack<Integer> stack=new Stack<>();
stack.push(0);
for(char c:S.toCharArray()){
if(c=='(')
stack.push(0);//遇到左括号则深度+1
else {
int cur=stack.pop();//当前深度
int prev=stack.pop();//上一层深度
//当前深度*2+上一层深度
stack.push(prev+Math.max(2*cur,1));
}
}
return stack.pop();
}
}