856. 括号的分数(栈+计数)

135 阅读2分钟

image.jpeg

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目提示

    • S 是平衡括号字符串,且只含有 ( 和 ) 。
    • 2 <= S.length <= 50

二、思路分析:

我们今天拿到本题是 leetcode 难度为中等题 856. 括号的分数。本题要求对一个只含左括号和右括号的字符串根据计算规则,计算出括号的分数。具体的规则如下:

  • ():一对括号,计为1分
  • (A): A代表嵌套平衡括号字符,计为2*A
  • (A+B): 计为A+B分

根据题目内容,关于括号的题目我们可以快速想到运用或者计数的方式来解答,思路如下:

  • 方法一:栈

    • 栈的特点是先进后出,因此我们只需要使用栈顶来记录括号深度即可
    • 定义一个数组st,并初始化添加0。0代表空字符的得分。
    • 遍历平衡字符串s,当ss字符为左括号时,则st添加分数0入栈
    • 当ss字符为右括号时,则st顶部值出栈并赋值给t.同时取2*t,1的最大值与栈顶的st[-1]值进行累计求和更新
    • 直到遍历完字符串s,返回st[-1]的值
    class Solution(object):
        def scoreOfParentheses(self, s):
            st = [0]
            for i,ss in enumerate(s):
                if ss =="(": 
                    st.append(0)
                else:
                    t = st.pop()
                    st[-1] += max(2*t,1)
    
            return st[-1]
    
  • 方法二:计数

    • 计算括号的分数,其实就是记录括号()的1的分数
    • 定义两个变量ans,t分别代表分数结果,左括号出现的次数
    • 遍历s字符串,当ss为左括号时,则临时变量t进行+1
    • 当ss为右括号时,则临时变量t进行-1,并同时判断s[i-1]的字符是否为左括号,如果是则代表(A)的情况需要将ans结果进行更新为2*t
    class Solution(object):
        def scoreOfParentheses(self, s):
            """
            :type s: str
            :rtype: int
            """
            ans,t = 0,0
            for i,ss in enumerate(s):
                if ss =="(": 
                    t +=1
                else:
                    t -=1 
                    if s[i-1] == "(":
                        ans += 2**t
            return ans
    

三、总结:

本题是一道关于括号匹配的问题,需要明确在字符串中找到并行的()和嵌套的括号深度A,其结果更新为2*A累计和。计数和栈可以快速解答本题,计数方法 AC提交记录如下:

image.png

  • 时间复杂度:O(n),n为字符串s的长度
  • 空间复杂度:O(1),没有使用额外空间

以上是本期内容,欢迎大佬们点赞评论,下期见~~~