要求
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
- 任何左括号 ( 必须有相应的右括号 )。
- 任何右括号 ) 必须有相应的左括号 ( 。
- 左括号 ( 必须在对应的右括号之前 )。
- * 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
- 一个空字符串也被视为有效字符串。
示例 1:
输入: "()"
输出: True
示例 2:
输入: "(*)"
输出: True
示例 3:
输入: "(*))"
输出: True
注意:
- 字符串大小将在 [1,100] 范围内。
核心代码
class Solution:
def checkValidString(self, s: str) -> bool:
n = len(s)
tmp = []
xin = []
for i in range(n):
if "(" == s[i]:
tmp.append(i)
elif "*" == s[i]:
xin.append(i)
else:
if 0 == len(tmp):
if 0 == len(xin):
return False
else:
del xin[-1]
else:
del tmp[-1]
while len(tmp) > 0 and len(xin) > 0:
if tmp[-1] > xin[-1]:
return False
else:
del tmp[-1]
del xin[-1]
return 0 == len(tmp)
解题思路:我们首先先使用两个列表来存储"("和"*", 循环遍历,当我们遇到上面两个字符的时候,我们加入各自的列表,如不是上述字符,我们先看"("的列表中的数量,有则从"("中消除,没有从"*"的列表中消除,都不行,那肯定不是有效的;循环玩一遍之后我们会剩下一些"("和"*",我们比较下数量即可知道,是否有效,因为*可以是一个空字符串,所以"*"数量多余或等于"("的数量都是OK的。