思路:
题目给定字符串,全部是左右括号组成,其实就是乘法分配律
例:如果是(),那就是2的0次方,如果是(()),那就是2的1次方,如果是((())),那就是2的2次方,以此类推,如果是示例4那种混合型的,那就要用到乘法分配律了,( () (()) ) == (()) + ((())),把字符串数组全部拆成次方形式,然后计算相加。
吐槽一下,做这个题,60%的时间用来理解题目到底啥意思,30%的时间用来想方法,10%的时间用来敲代码
#include<iostream>
#include<stack>
#include<cmath>
using namespace std;
class Solution
{
public:
int scoreOfParentheses(string S)
{
stack<char> cStack;
int result = 0;
int flag;
for(auto c:S)
{
if(c == '(')
{
cStack.push(c);
flag=1;
}
else
{
if(flag==1)
{
result+= pow(2,cStack.size()-1);
flag = 0;
}
cStack.pop();
}
}
return result;
}
};
int main()
{
Solution s;
string str = "((((()))";
// string str = "(()(()))";
// string str = "()";
int num;
num = s.scoreOfParentheses(str);
cout<<num<<endl;
return 0;
}
在评论区看到大佬的代码,很精巧
链接:https://leetcode-cn.com/problems/score-of-parentheses/comments/73730
class Solution
{
public:
int scoreOfParentheses(string S)
{
int result = 0;
int temp = 0;
stack<int> nStack;
for(auto c:S)
{
if(c=='(')
{
nStack.push(temp);
temp = 0;
}
else
{
temp += nStack.top() + max(temp,1);
nStack.pop();
}
}
return temp;
}
};