20. 有效的括号

20. 有效的括号

描述

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

有效字符串需满足:

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

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

Example

示例 1:

输入: "()"
输出: true

示例 2:

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

示例 3:

输入: "(]"
输出: false

示例 4:

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

示例 5:

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

思路

1. 使用栈

提到括号匹配立马能想到的肯定就是栈了。

对要进行匹配的字符串依次入栈,有下面几种情况:

  1. 当前字符为开括号,入栈
  2. 当前字符为闭括号:
    1. 若栈为空,能得出不匹配的结论
    2. 栈不为空,出栈,出栈字符与当前字符串是否正好匹配,匹配就进入下一字符,否则不匹配

我实现的代码比较繁琐,想导入 python 自带的库来实现栈,但 LeetCode 不支持,只好自己用代码实现。效果不怎么好,beat 掉 60% 。

class Stack(object):

   def __init__(self):
       self.items = []

   def isEmpty(self):
       return self.items == []

   def push(self, item):
       self.items.append(item)

   def pop(self):
       return self.items.pop()

   def peek(self):
       return self.items[len(self.items) - 1]

   def size(self):
       return len(self.items)

class Solution:
   def isValid(self, s):
       """
       :type s: str
       :rtype: bool
       """
       # from pythonds.basic.stack import Stack
       stack = Stack()
       balanced = True
       index = 0

       while index < len(s) and balanced:
           index_s = s[index]
           if index_s in "([{":
               stack.push(index_s)
           else:
               # 如果当前字符不是开括号且栈为空,则一定不匹配
               if stack.isEmpty():
                   balanced = False
               else:
                   top = stack.pop()
                   if not self.matchs(top, index_s):
                       balanced = False

           index += 1

       if balanced and stack.isEmpty():
           return True
       else:
           return False

   def matchs(self, start, end):
       """
       通过定义字符串,根据字符串的下标是否相同
       来检查括号是否匹配
       :param start: 开括号
       :param end: 闭括号
       :return:
       """
       starts = "([{"
       ends = ")]}"

       return starts.index(start) == ends.index(end)

再来看别人同样用栈。方法是直接使用 list 的 pop 和 append 方法实现栈,beat 掉了 99% 之多,我觉得可能是由于他有直接 return 而我是最后一起 return 的。

class Solution:
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        if not s:
            return True

        d = {'(': ')', '[': ']', '{': '}'}
        stack = []
        for i in s:
            if i in d:
                stack.append(i)
            else:
                if not stack or d[stack.pop()] != i:
                    return False

        else:
            if stack:
                return False

        return True

2. 巧用 replace 函数

这个方法我只能说比较贼了。

利用 replace 函数不断将已经成对的括号组替换成空字符串,若最后字符串为空则是匹配的。这个能 beat 掉多少我也没试。

class Solution:
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        len_num = len(s)

        # 默认空字符串为TRUE
        if len_num == 0:
            return True

        # 字符数为奇数,不可能匹配
        if len_num % 2 != 0:
            return False

        while '()' in s or '[]' in s or '{}' in s:
            s.replace("()", "").replace("[]", "").replace("{}", "")

        return s == ''

GitHub地址:https://github.com/protea-ban/LeetCode

posted @   banshaohuan  阅读(141)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
点击右上角即可分享
微信分享提示