zoukankan      html  css  js  c++  java
  • 【leetcode】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].


    解题思路:

    题目要求检查括号是否匹配,匹配的规则可以认为和小学数学四则运算里面括号的用法一样,即一个右括号必须对应一个左括号,有对应关系的右括号必须在左括号右边,等等等等。。。题目为了增加一点难度,引入了一个万能符号*,一个*号可以用作一个左括号,也可以用作一个右括号,或者一个空字符。

    万变不离其宗,我的解法是遍历输入的string,如果字符是左括号或者*号则按照类似入栈的方式存入数组stack中,如果遇到右括号,则寻找数组stack中最近一次存入的左括号。如果存在,把左括号从数组中删除,继续遍历string;如果不存在左括号,删除最近存入的*号;如果左括号和*号均不存在于数组stack中,则返回这是一个不合法的字符串。说了这么多如果分支,其实原则就是,左括号优先和右括号进行匹配,如果没有左括号,用离右括号最近的*号匹配。

    最后,遍历完成string后,还需要检查数组stack中剩余的元素,这时数组stack中只会存在左括号和*号(右括号不会存入stack),还需要再分析一次剩余元素是否合法。检查的算法和上述几乎一样,遍历stack,如果元素是*号,存入数组stack2;如果是左括号,判断stack2是否存在*号;如果没有,说明是非法字符串;如果存在则删掉最近存入stack2的*号,继续循环,直到所有的左括号都有*号与之匹配。

    啰啰嗦嗦说了一串,还是上代码吧,写的比较乱。

    class Solution(object):
        def findLastChar(self,stack):
            for i in range(len(stack)):
                if stack[i] == '(':
                    del stack[i]
                    return True
            return False
    
        def checkValidString(self, s):
            """
            :type s: str
            :rtype: bool
            """
            stack = []
            for i in s:
                if i != ')':
                    stack.insert(0,i)
                else:
                    isFind = False
                    while len(stack) > 0:
                        if stack[0] == '(' :
                            isFind = True
                            del stack[0]
                            break
                        elif stack[0] == '*':
                            if self.findLastChar(stack) == False:
                                del stack[0]
                            isFind = True
                            break
                        else:
                            del stack[0]
                    if isFind == False:
                        return False
            stack2 = []
            for i in stack:
                if i == '*':
                    stack2.insert(0,i)
                else:
                    if len(stack2) == 0:
                        return False
                    del stack2[0]
            return True
  • 相关阅读:
    apio2018题解
    ynoi2018
    hdu2036
    Morley's Theorem
    计算几何
    luogu1355 神秘大三角
    poj2398
    洛谷---小L和小K的NOIP考后放松赛
    LibreOJ β Round #7
    python3
  • 原文地址:https://www.cnblogs.com/seyjs/p/7655716.html
Copyright © 2011-2022 走看看