题目:
给定一个平衡括号字符串 S
,按下述规则计算该字符串的分数:
()
得 1 分。AB
得A + B
分,其中 A 和 B 是平衡括号字符串。(A)
得2 * A
分,其中 A 是平衡括号字符串。
提示:
S
是平衡括号字符串,且只含有(
和)
。2 <= S.length <= 50
题目解析:
可以用两个栈来做,一个栈保存操作符号,另一个栈保存操作数,对于括号,我们先要把括号变成操作数,所以必须两个两个字符来判断,所以一共四个类别,分别是
1、“ (( ” , 这个情况是要把括号内的数乘2,所以符号栈压入乘法,我用数字2 标志当成乘法
2、“ () ” , 这个情况等于数字1, 所以数字栈压入 1
3、“ )( ” , 这个情况是左右两边的数字做加法,所以符号栈压入加法,我用数字0 标志当成加法
4、“ )) ” , 这个情况是括号内乘法结束, 所以要从符号栈里取符号,(1)如果栈顶为2(也就是乘法),取数字栈栈顶元素,乘2后再次压入数字栈,符号栈的栈顶2出栈;(2)如果栈顶为0(也就是加法),取数字栈栈顶两个元素做加法后压栈,栈顶0出栈,重复次操作,直到栈顶为2,返回(1)操作。
当符号栈不为空,继续“))”的情况的操作,直到为空, 最后的数字栈栈顶就是结果。
代码:
class Solution {
public:
int scoreOfParentheses(string S) {
stack<int> stk_sym;
stack<int> stk_num;
for(int i = 0; i < S.size()-1; i++){
if(S[i] == '(' && S[i+1] == '('){
stk_sym.push(2);
}
else if(S[i] == '(' && S[i+1] == ')')
stk_num.push(1);
else if(S[i] == ')' && S[i+1] == '('){
stk_sym.push(0);
}
else if(S[i] == ')' && S[i+1] == ')'){
if(stk_sym.top() == 0){
while(stk_sym.top() == 0){
int x = stk_num.top();
stk_num.pop();
int y = stk_num.top();
stk_num.pop();
stk_num.push(x+y);
stk_sym.pop();
}
int x = stk_num.top();
stk_num.pop();
stk_num.push(x*2);
stk_sym.pop();
}
else{
int x = stk_num.top();
stk_num.pop();
stk_num.push(x*2);
stk_sym.pop();
}
}
}
while(!stk_sym.empty()){
if(stk_sym.top() == 2){
int x = stk_num.top();
stk_num.pop();
stk_num.push(2*x);
stk_sym.pop();
}
else if(stk_sym.top() == 0){
int x = stk_num.top();
stk_num.pop();
int y = stk_num.top();
stk_num.pop();
stk_num.push(x+y);
stk_sym.pop();
}
}
return stk_num.top();
}
};