题目:

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

【leetcode】Valid Parenthesis String的更多相关文章

  1. 【LeetCode】481. Magical String 解题报告(Python)

    [LeetCode]481. Magical String 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http:/ ...

  2. 【LeetCode】880. Decoded String at Index 解题报告(Python)

    [LeetCode]880. Decoded String at Index 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...

  3. leetcode 678. Valid Parenthesis String

    678. Valid Parenthesis String Medium Given a string containing only three types of characters: '(', ...

  4. [leetcode]678. Valid Parenthesis String验证有效括号字符串

    Given a string containing only three types of characters: '(', ')' and '*', write a function to chec ...

  5. [LeetCode] 678. Valid Parenthesis String 验证括号字符串

    Given a string containing only three types of characters: '(', ')' and '*', write a function to chec ...

  6. 【LeetCode】#344 Reverse String

    [Question] Write a function that takes a string as input and returns the string reversed. Example: G ...

  7. 【LeetCode】606. Construct String from Binary Tree 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:先序遍历 日期 题目地址:https://l ...

  8. 【LeetCode】394. Decode String 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 日期 题目地址:https://leetcode ...

  9. 【leetcode】Valid Palindrome

    题目简述: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ...

随机推荐

  1. 应用安全 - 工具 | 平台 -webmin - 漏洞 - 汇总

    简介 开发语言 PHP 用途系统管理 CVE-2019-15642 Date2019.7 类型远程代码执行 影响范围Webmin <= 1.920 复现POC|EXPOBJECT Socket; ...

  2. 【Qt开发】 数字转QString格式化

    1 想要获得001 002 这样的数字 QString b=QString("%1").arg(i, 3, 10, QChar('0')); QStringList list;   ...

  3. 在kali2.0中使用msf图形界面可能会遇到的问题

    kali版本:Linux kali 4.9.0-kali3-amd64 #1 SMP Debian 4.9.18-1kali1 (2017-04-04) x86_64 GNU/Linux 编写日期:2 ...

  4. 2019JAVA第七次实验报告

    Java实验报告 班级 计科二班 学号 20188442 姓名 吴怡君 完成时间 2019.10.25 评分等级 实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)1 ...

  5. spring boot-16.使用redis做缓存

    spring boot 自动配置了多种 缓存管理器,按照下面的顺序查找,如果容器中有相应的组件,则使用相应的缓存管理器. Generic JCache (JSR-107) EhCache 2.x Ha ...

  6. (5.2)mysql高可用系列——测试环境部署

    关键词环境部署: ############## 测试环境机器架构 #########[1]策划[1.1]linux服务器A组 8台 192.168.1.200~192.168.1.207,主机名db, ...

  7. T2 AC自动机

    T2:AC自动机 (ac.cpp) 题目背景 YZD在每天学习20小时的勤奋研究下,终于开发出了AC自动机!但是,这台AC自动机有一些bug,比如两个部件之间经常会出一些莫名其妙的问题,所以他想要随时 ...

  8. HDU 3182 ——A Magic Lamp(思维)

    Description Kiki likes traveling. One day she finds a magic lamp, unfortunately the genie in the lam ...

  9. 第一次参赛经历:ecfinal总结

    刚接到要去参加ec的消息时,还是非常激动的,毕竟第一次参赛就参加如此高水平的编程竞赛(更高水平的比赛就是wf). 教练临时组队,把三个从没在一起打过比赛的三个人组成一队,当时有点担心默契和配合上的问题 ...

  10. Python数据基础类型-列表

    1,列表的创建 list1 = ['hello', 'world', 1997, 2000] list2 = [1, 2, 3, 4, 5 ] list3 = ["a", &quo ...