题目描述:
LeetCode 678. Valid Parenthesis String
Given a string containing only three types of characters: '(', ')' and '*', write a function to check whether this string is valid. We define the validity of a string by these rules:
- Any left parenthesis
'('
must have a corresponding right parenthesis')'
. - Any right parenthesis
')'
must have a corresponding left parenthesis'('
. - Left parenthesis
'('
must go before the corresponding right parenthesis')'
. '*'
could be treated as a single right parenthesis')'
or a single left parenthesis'('
or an empty string.- An empty string is also valid.
Example 1:
Input: "()" Output: True
Example 2:
Input: "(*)" Output: True
Example 3:
Input: "(*))" Output: True
Note:
- The string size will be in the range [1, 100].
题目大意:
给定一个字符串,只包含 '(', ')' 和 '*','*'可以代表'('或者')'或者空。
判断给定字符串是否是一个有效的括号字符串。
解题思路:
遍历s中的字符c,利用集合vset记录所有当前左括号-右括号的差值 若c == '(',将vset替换为其所有元素+1 若c == ')',将vset替换为其所有不小于1的元素 - 1 若c == '*’,将vset中的所有元素+1,-1后,保留非负元素 遍历结束,判断vset中是否包含0元素
Python代码:
class Solution(object):
def checkValidString(self, s):
"""
:type s: str
:rtype: bool
"""
vset = set([0])
for c in s:
nset = set()
if c == '*':
for v in vset:
nset.add(v + 1)
nset.add(v)
if v >= 1: nset.add(v - 1)
elif c == '(':
for v in vset:
nset.add(v + 1)
elif c == ')':
for v in vset:
if v >= 1: nset.add(v - 1)
vset = nset
return 0 in vset
本文链接:http://bookshadow.com/weblog/2017/09/17/leetcode-valid-parenthesis-string/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。