20.有效的括号

问题描述

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

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

注意空字符串可被认为是有效字符串。
示例 1:

输入: "()"
输出: true

示例 2:

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

示例 3:

输入: "(]"
输出: false

示例 4:

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

示例 5:

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

解题思路

之前没怎么刷过算法题,所以参考了下别人的代码,大致都是通过遍历字符串中的字符,首先将"(""{""["这三种字符压进栈,当遇到")""{""["这三种字符时,进行出栈操作,将出栈后的字符与遇到的字符做匹配,如匹配成功则算法继续运行,当匹配不成功时则退出算法返回False。

另外,在自己实现算法时发现经常需要判断栈是否为空,有时候栈不为空时却返回了字符串为正确的结果,在自己做题时还是需要注意到这些细节的。

具体代码

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        i = 0
        stack = []
        while i < len(s):
            if s[i] == "[" or s[i] == "{" or s[i] == "(":
                stack.append(s[i])
            elif s[i] == "]" and stack: #判定栈是否为空
                if stack[-1] == "[":
                    stack.pop()
                else:
                    break
            elif s[i] == "}" and stack:
                if stack[-1] == "{":
                    stack.pop()
                else:
                    break
            elif s[i] == ")" and stack:
                if stack[-1] == "(":
                    stack.pop()
                else:
                    break
            else:#这种情况是栈为空或者遇到其他符号
                break
            i += 1
        if i == len(s) and not stack:#栈为空时才算正确
            return True
        else:
            return False
        

你可能感兴趣的:(20.有效的括号)