Python学习日记——有效的括号

Python学习日记014——有效的括号

题目来源:LeetCode题库——有效的括号
给定一个只包括 ‘(’ , ‘)’ , ‘[’ , ‘]’ , ‘{’ , ‘}’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
Example1:
输入: “()”
输出: true
Example2:
输入: “()[]{}”
输出: true
Example3:
输入: “(]”
输出: false
Example4:
输入: “([)]”
输出: false
Example5:
输入: “{[]}”
输出: true
链接:https://leetcode-cn.com/problems/valid-parentheses

有效的括号
对于这个问题,我们可以首先将其分为两大模块考虑。一个是空字符串,一个是非空字符串。对于空字符串,返回为true。
而对于非空字符串,我们可以通过“”的思想,建立一个新的数组,将字符串中的元素依次添加到数组中,每添加一次,就判断其是否含有“有效的括号“:如果不含“有效的括号“,那么继续添加。如果含“有效的括号”,则先将这一对有效的括号删除掉,然后再继续添加。
如果最后这个数组为空数组,那么说明所有括号都找到了与之可以按照法则配对的另一半括号,则该字符串有效,返回 true 。如果最后这个数组不是空数组,那么说明有括号没有按照法则配对成功,返回 false 。
具体实现过程如下:

class Solution:
    def isValid(self, s: str) -> bool:
        if len(s) == 0:     #空字符串
            return True
        else:    #非空字符串
            tem = [s[0]]     #原始数组中包含字符串的第一个元素
            j = 0     #变量j作为指针用来控制比较位的移动
            for i in range(1,len(s)):
                if len(tem) >= 1:
                    tem.append(s[i])    #将字符串的元素依次添加到数组中
                    if tem[j] == "(" and tem[j+1] == ")": 
                        tem.pop()   #对于满足配对法则的括号,将其删除
                        tem.pop()   #删除是要删除一对括号
                        j -= 1    #删除后,比较位需要前移来开始下一轮的比较
                        if j < 0:  #比较位的最小位置为0位置
                            j = 0
                    elif tem[j] == "[" and tem[j+1] == "]":
                        tem.pop()
                        tem.pop()
                        j -= 1
                        if j < 0:
                            j = 0
                    elif tem[j] == "{" and tem[j+1] == "}": 
                        tem.pop()
                        tem.pop()
                        j -= 1
                        if j < 0:
                            j = 0
                    else:
                        j += 1
                else:
                    tem.append(s[i])
                    continue
            if tem == []:   #若为空数组,说明该字符串内的括号均为有效括号
                return True
            else:
                return False
                

其中最内层的 if 、elif 、elif 控制语句的三个条件可以合并写为:

if (tem[j] == "(" and tem[j+1] == ")") or (tem[j] == "[" and tem[j+1] == "]") or (tem[j] == "{" and tem[j+1] == "}"): 
              tem.pop()
              tem.pop()
              j -= 1
              if j < 0:
                    j = 0

这里将控制条件分条展开描述笔者认为更易理解。


在力扣的评论区看到一种很简便的解法,和笔者的方法有异曲同工之处,但实现起来精简了非常多,在此呈现供学习参考:

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 == ''
        

学习过程中,欢迎指正。

你可能感兴趣的:(python,leetcode)