[LeetCode] 856. 括号的分数
规则:
()
得一分AB
得A + B
分,其中 A 和 B 是平衡括号字符串(A)
得2 * A
分,其中 A 是平衡括号字符串
给定一个平衡字符串求最后的分数:
思路:
这种括号类的题目使用栈的一般解法:左括号进栈,遇到右括号出栈
问题的关键是:如何在出栈的时候计算分数!
假设我们在括号匹配(遇到 )
) 的时候计算分数。
我们不难发现一个性质,如果遇到 )
出栈后
- 栈是空的,则说明这对括号不在任何另外一对括号里面
- 栈非空,说明这对括号在栈顶的括号内部,也就是上面说到的
(A)
情况
为了避免讨论,我们可以假设最外面还有一个大括号,所以只要在一对 ()
完成匹配之后,栈顶的元素就是这对括号最相邻的外面的括号。
知道了这个性质,我们就可以计算出 (A)
中 A 的值:只要 A 中括号匹配了之后就将其值加到外面的括号上去,最后 * 2 就是 (A)
的值。
这样的话问题就简化为了 (A)
这一种情况,如何求出 A 的值。
- 如果 A 是
(B)
这种形式,就继续求 B,然后将 B 的分数加到外面括号上 - 如果 A 是
BC...
这种形式,就是 B, C 的组合,B, C 在退栈之后栈顶就是外边的括号,直接将值加到栈顶就行。
栈里面存储的只是括号内的和,要 * 2 才是这个括号序列最终的值。
边界条件? A 为空:()
,2 * 0 = 0,所以在遇到这种情况的时候要将其变为 1
具体流程:
- 首先向栈里面 push(0) 代表最外面的一个虚拟括号,用来计算最后的值
- 遍历
- 遇到
(
push(0),代表当前括号内的值 - 遇到
)
如果当前括号内的值为 0 则值为1,否则值为 * 2,计算出值后,加到外围的括号上面
- 遇到
最后栈顶元素就是答案。
代码:
class Solution {
public:
int scoreOfParentheses(string s) {
stack<int> stk;
stk.push(0);
for (char ch : s) {
if (ch == '(') {
stk.push(0);
} else {
int v = stk.top();
stk.pop();
stk.top() += max(2*v, 1);
}
}
return stk.top();
}
};
欢迎转载,转载请注明出处!