持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目提示
1 <= s.length <= 1000s只包含'('和')'字符。
二、思路分析:
我们今天拿到本题是 leetcode 难度为中等题 921. 使括号有效的最少添加。根据题目要求对字符串s中,进行添加最少括号,让s字符串内的括号变得有效。括号有效有哪些场景呢?
- 当字符串s,是空字符串
- 当字符串s,是(
AB(A与B连接),"A"与"B"是有效的 - 当字符串s,是(
A)
根据题目内容,我们可以使用贪心算法来进行解答,思路如下:
-
方法一:贪心+栈
- 左括号与右括号匹配一对才算做有效,因此我们可以借助栈的思想来解答
- 使用for循环遍历字符串s的所有字符
- 当字符为左括号时,则进行入栈操作
- 当字符为右括号时,且栈不为空,栈顶的字符为左括号,则进行出栈操作
- 其他情况,仍然进行入栈操作
- 直到遍历完字符串s,栈中剩余的括号即为需要添加的,则结果直接返回栈道长度即可
class Solution(object): def minAddToMakeValid(self, s): """ :type s: str :rtype: int """ st = [] for i in range(len(s)): if s[i]==")" and st and st[-1]=="(": st.pop() else: st.append(s[i]) return len(st) -
方法二:贪心+计数
- 在本题中,需要计算添加的括号数,也可以使用计数的方式来解答
- 定义变量cnt来记录左括号数,初始化为0,遍历字符串s的所有字符
- 当字符是左括号时,则cnt值增加1
- 当字符是右括号时,如果cnt值时大于0时,说明左右匹配一对括号,则cnt值减去1;否则的话,则无法匹配需要添加括号,则ans+1
- 直到遍历完字符串s,将cnt值与ans值进行合计并作为结果返回
class Solution(object): def minAddToMakeValid(self, s): ans,cnt = 0,0 for ss in s: if ss == "(": cnt +=1 elif cnt: cnt -=1 else: ans +=1 ans +=cnt return ans
三、总结:
本题是一道经典的括号匹配问题,左括号与右括号需要匹配才能算为有效,在本题中可以使用括号入栈判断栈顶的字符是否匹配,匹配则将栈顶字符进行出栈操作。同时,也可以使用计数方法来求解。本次AC提交记录如下:
- 时间复杂度:O(n),n为字符串s的长度。需要遍历一遍字符串s.
- 空间复杂度:O(1),计数方式无需额外空间
以上是本期内容,欢迎大佬们点赞评论,下期见~~~