20. 有效的括号

题目:

题目类别:栈
难度:容易

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

1、 左括号必须用相同类型的右括号闭合。
2、左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true

示例 3:

输入: "(]"
输出: false

示例 4:

输入: "([)]"
输出: false

示例 5:

输入: "{[]}"
输出: true

解题过程:

想了五分钟没想出来

答案:
解法一:巧妙地用了python里面的replace函数,程序简单清晰
class Solution:
    def isValid(self, s):
        while '{}' in s or '()' in s or '[]' in s:
            s = s.replace('{}', '')
            s = s.replace('[]', '')
            s = s.replace('()', '')
        return s == ''

解法二:栈,散列表
解题思路:

1、算法原理:

  • 栈的先入后出的的特点和本题寻找字符串中有效括号的特点一致,从字符串的左边开始,遇到左括号就入栈,遇到对应的右括号则左括号就出栈,最后全为有效括号的话,栈为空。
  • 建立哈希表,key为左括号,value为右括号,这样查找括号是否对应只需要O(1)时间复杂度

2、算法流程:

  • 判断字符串s中的字符c是否属于哈希表中的key,属于哈希表中的key则说明是左括号,将左括号入栈,如果不属于哈希表中的key,则把栈顶出栈,查找栈顶在哈希表中对应的value也就是有括号是否等于字符c,不等于就提前返回False。循环结束,判断stack是否只有元素‘?’。

3、提前返回 false

  • 提前返回优点: 在迭代过程中,提前发现不符合的括号并且返回,提升算法效率。

  • 解决边界问题:

    • 栈 stack 为空: 此时 stack.pop() 操作会报错;因此,我们采用一个取巧方法,给 stack 赋初值 “?” ,并在哈希表 dic 中建立 key:′?′,value:′?′key: ‘?’ 的对应关系予以配合。此时当 stack 为空且 c 为右括号时,可以正常提前返回 false;
    • 字符串 s 以左括号结尾: 此情况下可以正常遍历完整个 s,但 stack 中遗留未出栈的左括号;因此,最后需返回 len(stack) == 1,以判断是否是有效的括号组合。

4、复杂度分析

时间复杂度 O(N)O(N)O(N):正确的括号组合需要遍历 111 遍 s;
空间复杂度 O(N)O(N)O(N):哈希表和栈使用线性的空间大小。
#stack.append(c)   c入栈
#stack.pop()  栈顶出栈

class Solution:
    def isValid(self, s: str) -> bool:
        dic = {'{': '}',  '[': ']', '(': ')', '?': '?'}
        stack = ['?']
        for c in s:
            if c in dic: stack.append(c)
            elif dic[stack.pop()] != c: return False 
        return len(stack) == 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值