LeetCode | 856括号分数

问题描述

给定一个平衡括号字符串 S S S,按下述规则计算该字符串的分数:

  • ( ) () () 1 1 1 分;
  • A B AB AB A + B A + B A+B分,其中 A A A B B B 是平衡括号字符串;
  • ( A ) (A) (A) 2 ∗ A 2 * A 2A 分,其中 A A A 是平衡括号字符串。

样例输入

示例 1:

输入: “()”
输出: 1

示例 2:

输入: “(())”
输出: 2

示例 3:

输入: “()()”
输出: 2

示例 4:

输入: “(()(()))”
输出: 6

代码

法一:栈

将平衡字符串看做空字符与输入 s s s的结合,空字符作为初始分数,不断变换累加得到最终平衡字符串的得分:
如果遇到左括号,直接将其入栈,并压入其代表的分数0;
如果遇到右括号,则代表括号内部可能包含平衡字符串,这时候分类讨论:如果栈顶元素为0,则将栈顶元素出栈并更改新栈顶元素值为1;否则将新栈顶元素的值加倍,并累加。

class Solution:
    def scoreOfParentheses(self, s: str) -> int:
        ans=[0]

        for letter in s:
            if letter=='(':
                ans.append(0)
            else:
                v=ans.pop()
                ans[-1]+=max(2*v,1)

        return ans[-1]
if __name__ == '__main__':
    print(Solution().scoreOfParentheses('()()'))

法二:类似dfs

直接深度到最深的括号对处,只计算形如 ( ) () ()的括号对所代表的分数

class Solution:
    def scoreOfParentheses(self, s: str) -> int:
        ans,deep=0,0
        for idx,letter in enumerate(s):
            if letter=='(':
                deep+=1
            else:
                deep-=1
            if letter==')' and s[idx-1]=='(':
                if deep!=0:
                    ans+=1<<deep
                else:
                    ans+=1
        return ans

if __name__ == '__main__':
    print(Solution().scoreOfParentheses('(((())))'))

你可能感兴趣的:(LeetCode,leetcode,深度优先,算法)