给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
() 得 1 分。
AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
(A) 得 2 * A 分,其中 A 是平衡括号字符串。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/score-of-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
对于s中的左括号字符,直接入栈
对于s中的右括号字符,有两种情况:
情况1:当此时栈顶就是左括号时,直接将栈顶元素出栈,将1入栈,表示得分为1
情况2:当此时栈顶元素是得分时,需要写一个while循环,并将所有当前栈顶的得分计入ans中,不停的弹出栈顶得分元素,最后扫描到左括号时,while循环结束,ans中存放了这层括号内所有的得分元素,只需要将当前栈顶的左括号出栈,再把总得分ans2压入栈中即可,即(A)=A2得分,无论A是多少得分的和,都可以看作一个整体
最后栈中一定存放的是所有并列的得分如A/B/C等,只需要将栈中元素求和就可以得到当前字符s的总得分
代码
from collections import deque
class Solution:
def scoreOfParentheses(self, s: str) -> int:
stack=deque([])
for i in s:
if i=='(':
stack.append(i)
else:
if stack[-1]=='(':
stack.pop()
stack.append(1)
else:
ans=0
while stack[-1]!='(':
ans+=stack[-1]
stack.pop()
stack.pop()
stack.append(2*ans)
return sum(stack)