678. 有效的括号字符串
原始题目链接:https://leetcode.cn/problems/valid-parenthesis-string/
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
任何左括号 ( 必须有相应的右括号 )。
任何右括号 ) 必须有相应的左括号 ( 。
左括号 ( 必须在对应的右括号之前 )。
- 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
一个空字符串也被视为有效字符串。
示例 1:
输入: “()”
输出: True
示例 2:
输入: “(*)”
输出: True
示例 3:
输入: “(*))”
输出: True
注意:
字符串大小将在 [1,100] 范围内。
解题思路:
贪心方法,正向和反向分别两次计算,正向计算足够多的字符’(‘的个数,反向计算足够多的字符‘)’的个数,因为’*'这字符可匹配括号及空字符,所以正向和反向都可以用与匹配。具体思想及证明可看参考文献。
代码实现:
class Solution:
def checkValidString(self, s: str) -> bool:
# 用于正向和反向统计匹配的字符个数
def help(number):
count = 0
if number == 1:
for c in s:
if c == '(':
count += 1
if c == ')':
count -= 1
if c == '*':
count += 1
if count < 0:
return False
else:
for c in reversed(s):
if c == '(':
count -= 1
if c == ')':
count += 1
if c == '*':
count += 1
if count < 0:
return False
return True
return help(1) and help(-1)
参考文献:
https://leetcode.cn/problems/valid-parenthesis-string/solution/tan-xin-zhi-jie-zhuan-hua-xing-hao-by-no-96j6/