思路:
这道题有个要求就是(A)的得分要乘2,那这就有个问题了,如何记录一个括号之间有多少分呢,又该如何记录以前的分数,并能区分不是一个括号里面的之前算出来的分数。
又因为我们可能回下意识的把栈定义为char类型把‘(‘放入栈里,这样就没思路了。
考虑题目说给的string一定是平衡括号对,所以我们用0代替‘(’,栈是int类型,那么我们同时可以存放获得的分数了,只要遍历到的s不是‘(‘,并且栈顶元素是0,那么我们就pop掉栈顶元素,并将1分push进去,如果栈顶元素不是0,那么我们就遇到了(A)这种情况了,定义一个sum,用来求和得到A,通过while,条件为栈顶元素不为0,循环结束就得到了A,我们在A*2后push进栈。那么当S遍历结束,所有结果都在栈里面,我们在取出来即可。
因为()()的存在,我们不能直接返回st.top的值,因为这种情况:当完成第一个平衡括号对,并加入下一个‘(‘时栈为[1,0],最后栈为[1,1],所以最后要取出栈里所有值求和。
代码:
class Solution {
public:
int scoreOfParentheses(string S) {
stack<int> st;
int res=0;
for(auto& s:S){
if(s==‘(‘) st.push(0);
else {
if(st.top()==0){
st.pop();
st.push(1);
}
else{
int sum=0;
while(st.top()!=0){
sum +=st.top();
st.pop();
}
st.pop();
st.push(2*sum);
}
}
}
while(!st.empty()){
res+=st.top();
st.pop();
}
return res;
}
};
原文:https://www.cnblogs.com/Mrsdwang/p/14635005.html