856. 括号的分数
解题报告:
括号问题考虑栈。
本来是想用栈做,但是发现其实得分是相加还是乘2,和括号的层级有关系。
比如第三层的括号之间就是相加,第二层的括号就是把第三层的分数和乘2。记得算完第二层的分之后,要把第三层的清零,因为后面还有可能出现第三层。
至于最里层的括号,发现只有最内层的括号会有这个问题(需要赋初值为1,而不是向高层乘2)。两个解决思路:
一是像代码一样,用个max判断一下。
二是预处理一下字符串,比如最内层的中间给加个特殊字符&,然后如果遍历到&,就cnt[sk.size()]=1就可以了。
总体看下来,栈其实就只充当一个记录层数的作用了,完全可以用变量代替。
AC代码:
class Solution {
public:int cnt[55];int scoreOfParentheses(string s) {stack<char> sk;// for(int i = 0; i<=50; i++) cnt[i] = 1;int ans = 0;for(auto c : s) {if(c == '(') sk.push('(');else {cnt[sk.size()] += max(1, 2*cnt[sk.size()+1]);cnt[sk.size()+1] = 0;sk.pop();} }return cnt[1];}
};