题目描述:
解题思路:看到这些括号匹配首先想到用栈,
- 看到‘(’压栈并将factor因子加1
- 看到‘)’将栈顶'('弹栈,并将因子减1,如果和栈顶元素下标距离为1,则累加到结果中
- 只有相邻的'('和')'才会对res产生影响
代码如下(c++)版本:
class Solution {
public:
int scoreOfParentheses(string S) {
deque<pair<char, int>> stack;
int res = 0;
int factor = 0;
for (int i = 0; i < S.size(); i++) {
if (S[i] == '(') {
stack.push_back({ '(',i });
factor++;
}
else {
auto temp = stack.back();
stack.pop_back();
factor--;
if (i-temp.second == 1)
res += 1 << factor;
}
}
return res;
}
};
评论区:
思路1:用栈保存状态
代码如下:
class Solution:
def scoreOfParentheses(self, S):
"""
:type S: str
:rtype: int
"""
stack = [0]
for c in S:
if c == "(": # "("入栈
stack.append(0)
else:
last = stack.pop()
if last == 0: # "()"情况
stack[-1] += 1
else: # "(A)" "AB" 情况
stack[-1] += 2 * last
return stack.pop()
思路2:栈思想,但没有用到栈。给定一个标记n,若‘(’则n左移,若‘)’则n右移,若遇到()则sum+=n
代码如下:
class Solution {
public int scoreOfParentheses(String S) {
int length=S.length();
int sum=0;
int n=0;
for(int i=0;i<length;i++)
{
if(S.charAt(i)=='(')
{
if(n==0)
{
n=1;
}
else
{
n=n<<1;
}
}
else if(S.charAt(i)==')')
{
if(S.charAt(i-1)=='(')
{
sum+=n;
}
n=n>>1;
}
}
return sum;
}
}
思路3:递归下降,(感觉自己编译白学了,呜呜呜)
代码如下:
'''grammar
expr -> term | term expr
term -> '(' ')' | '(' expr ')'
'''
class Solution(object):
def scoreOfParentheses(self, S):
"""
:type S: str
:rtype: int
"""
self.n = len(S)
self.i = 0
self.S=S
return self.expr()
def expr(self):
ct =0
while self.i<self.n and self.S[self.i]=='(':
ct+=self.term()
print(ct)
return ct
def term(self):
if self.S[self.i:self.i+2]=='()':
self.i+=2
return 1
self.i+=1
n = self.expr()
self.i+=1
return 2*n