每天一更 Leecode每日一题--isValid

题目

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

有效字符串需满足:

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

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

示例 1:

输入: "()"
输出: true

示例 2:

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

示例 3:

输入: "(]"
输出: false

示例 4:

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

示例 5:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解题

解法一:
一大神解法,看完佩服的五体投地,如果只是为了解这道题,这个解法足够,而且非常简单,既能简单理解代码还少。

这种解法真的不需要解释了,直接看代码吧

class Solution:
    def isValid(self, s: str) -> bool:
        while '()' in s or '[]' in s or '{}' in s:
            s = s.replace('()','')
            s = s.replace('[]','')
            s = s.replace('{}','')
        return s == ''

结果:
在这里插入图片描述


解法二:
官方解释:
1.我们从表达式的左侧开始,每次只处理一个括号。
2.假设我们遇到一个开括号(即 (),表达式是否无效取决于在该表达式的其余部分的某处是否有相匹配的闭括号(即 ))。此时,我们只是增加计数器的值保持跟踪现在为止开括号的数目。left += 1
3.如果我们遇到一个闭括号,这可能意味着这样两种情况:

此闭括号没有与与之对应的开括号,在这种情况下,我们的表达式无效。当 left == 0,也就是没有未配对的左括号可用时就是这种情况。
我们有一些未配对的开括号可以与该闭括号配对。当 left > 0,也就是有未配对的左括号可用时就是这种情况。

4.如果我们在 left == 0 时遇到一个闭括号(例如 )),那么当前的表达式无效。否则,我们会减少 left 的值,也就是减少了可用的未配对的左括号的数量。
继续处理字符串,直到处理完所有括号。
5.如果最后我们仍然有未配对的左括号,这意味着表达式无效。

作者:LeetCode
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

但是这种解法遇到 ‘([)]’ 就解决不了,我贴下代码:

class Solution:
    def isValid(self, s: str) -> bool:
        left = 0
        if s == '':
            return True
        for i in range(len(s)):
            if s[i] == '(' or s[i] == '{' or s[i] == '[':
                left +=1
            else:
                left -=1
        if left == 0:
            return True
        else:
            return False

结果:
在这里插入图片描述所以这种计数的方法行不通!

换种解决方法就是栈
算法:

1.初始化栈 S。
2. 一次处理表达式的每个括号。
3. 如果遇到开括号,我们只需将其推到栈上即可。这意味着我们将稍后处理它,让我们简单地转到前面的 子表达式。
4.如果我们遇到一个闭括号,那么我们检查栈顶的元素。如果栈顶的元素是一个 相同类型的 左括号,那么我们将它从栈中弹出并继续处理。否则,这意味着表达式无效。
5. 如果到最后我们剩下的栈中仍然有元素,那么这意味着表达式无效。

作者:LeetCode
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

完整代码:

class Solution:
    def isValid(self, s: str) -> bool:
        dic = {')': '(', ']': '[', '}': '{'}
        lst = []
        if s == '':
            return True
        for k in s:
            if k == '(' or k == '{' or k == '[':
                lst.append(k)   # 如果是({[这三种括号就进栈
            elif len(lst) == 0 or dic.get(k) != lst[-1]:  # 为什么这里还有判断栈的长度等不等于0?因为后面那个是最后总的结果而这里是为了s=']'这种情况
                return False
            else:     # 这种情况默认dic.get(k) == lst[-1]
                lst.pop()
        if len(lst) == 0:
            return True
        else:
            return False

结果:
在这里插入图片描述
第六天
over

这两天的题都需要好好琢磨的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值