传送门: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 Trueelse: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 Falsewhile left:if len(star) == 0: return False elif left[-1] > star[-1]: return False else:left.pop()star.pop()return True