856. Score of Parentheses

思路:
这道题有个要求就是(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;
    }
};
posted @ 2021-04-08 21:40  Mrsdwang  阅读(48)  评论(0编辑  收藏  举报