leetcode 856. 括號的分數
題目:
給定一個平衡括號字串 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
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();
}
};