持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目提示
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提交记录如下:
- 时间复杂度:O(n),n为字符串s的长度
- 空间复杂度:O(1),没有使用额外空间
以上是本期内容,欢迎大佬们点赞评论,下期见~~~