解题思路
从模拟角度出发,整个操作就是入栈出栈的过程,由于有符号和数字的存在,并且数字一定大于零,所以不妨把左括号设为-1,遍历字符串,遇到左括号就入栈(即放入-1)。遇到右括号需要判断,如果栈顶是左括号,拿出左括号放入1,否则,先把栈顶的所有数字加起来,此时栈顶还有左括号的话,执行(A)操作,最后把栈内所有的数字加起来返回即可(括号一定都匹配完成了),代码如下:
代码
class Solution {
public:
int scoreOfParentheses(string s) {
stack<int> st;
for(int i = 0; i < s.size(); i ++) {
// 左括号入栈
if(s[i] == '(') {
st.push(-1);
} else {// 右括号分情况判断
// 如果栈顶是左括号,拿出左括号放入1
if(st.top() == -1) {
st.pop();
st.push(1);
} else {// 把栈顶的所有数字加起来
int num = 0;
while(st.top() > 0 && !st.empty()) {
num += st.top();
st.pop();
}
// 还有左括号执行(A)操作
if(!st.empty()) {
num *= 2;
st.pop();
}
st.push(num);
}
}
}
int sum = 0;
while(!st.empty()) {
sum += st.top();
st.pop();
}
return sum;
}
};