[LeetCode]Valid Parenthesis String

题目描述:

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:

  1. Any left parenthesis '(' must have a corresponding right parenthesis ')'.
  2. Any right parenthesis ')' must have a corresponding left parenthesis '('.
  3. Left parenthesis '(' must go before the corresponding right parenthesis ')'.
  4. '*' could be treated as a single right parenthesis ')' or a single left parenthesis '(' or an empty string.
  5. An empty string is also valid.

Example 1:

Input: "()"
Output: True

Example 2:

Input: "(*)"
Output: True

Example 3:

Input: "(*))"
Output: True

Note:

  1. 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/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。

如果您喜欢这篇博文,欢迎您捐赠书影博客: ,查看支付宝二维码