LeetCode 678. 有效的括号字符串

传送门:https://leetcode-cn.com/problems/valid-parenthesis-string

题目描述:
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:

1、 任何左括号 ( 必须有相应的右括号 )。
2、任何右括号 ) 必须有相应的左括号 ( 。
3、左括号 ( 必须在对应的右括号之前 )。
4、* 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
5、一个空字符串也被视为有效字符串。

示例 1:

输入: "()"
输出: True
示例 2:

输入: "(*)"
输出: True
示例 3:

输入: "(*))"
输出: True

注意:
字符串大小将在 [1,100] 范围内。

思路:

定义两个栈 left, star 分别储存左括号和星号的位置
开始遍历字符串,遇到左括号和星号的时候分别入栈,当遍历到右括号的时候,首先查看left是否为空,若不为空,left栈顶元素出栈;若为空,查看star是否为空,若不为空,star栈顶元素出栈(此时星号被当作是左括号),若为空,直接返回False。

遍历结束,检查left是否为空,若不为空,检查star是否为空,为空说明此时已经没有星号与左括号匹配,直接返回False。如果left的栈顶元素大于star的栈顶元素,说明星号在左括号的左边,不满足题目要求,直接返回False。否则,left栈顶元素出栈,star栈顶元素出栈。直到left为空,返回True。

class Solution:
    def checkValidString(self, s: str) -> bool:
        if s=="*":
            return True
        else:
            left, star=[], []
            for i in range(len(s)):
                if s[i]=='(': 
                    left.append(i)
                elif s[i]=='*':
                    star.append(i)
                elif s[i]==')':
                    if left: 
                        left.pop()
                    elif star:
                        star.pop()
                    else:
                        return False
            while left:
                if len(star) == 0: 
                    return False 
                elif left[-1] > star[-1]: 
                    return False 
                else:
                    left.pop()
                    star.pop()
            return True
上一篇:本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。


下一篇:2.3万star!狂拽酷炫的终端:eDEX-UI