传送门: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