1. 程式人生 > >leetcode 856. 括號的分數

leetcode 856. 括號的分數

題目:

給定一個平衡括號字串 S,按下述規則計算該字串的分數:

  • () 得 1 分。
  • AB 得 A + B 分,其中 A 和 B 是平衡括號字串。
  • (A) 得 2 * A 分,其中 A 是平衡括號字串。

提示:

  1. S 是平衡括號字串,且只含有 ( 和 ) 。
  2. 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();

}

};