921. 使括号有效的最少添加(贪心算法)

106 阅读3分钟

image.jpeg

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

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

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

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目提示

    • 1 <= s.length <= 1000
    • s 只包含 '(' 和 ')' 字符。

二、思路分析:

我们今天拿到本题是 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提交记录如下:

image.png

  • 时间复杂度:O(n),n为字符串s的长度。需要遍历一遍字符串s.
  • 空间复杂度:O(1),计数方式无需额外空间

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