【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
【leetcode】Valid Parenthesis String的更多相关文章
- 【LeetCode】481. Magical String 解题报告(Python)
[LeetCode]481. Magical String 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http:/ ...
- 【LeetCode】880. Decoded String at Index 解题报告(Python)
[LeetCode]880. Decoded String at Index 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...
- leetcode 678. Valid Parenthesis String
678. Valid Parenthesis String Medium Given a string containing only three types of characters: '(', ...
- [leetcode]678. Valid Parenthesis String验证有效括号字符串
Given a string containing only three types of characters: '(', ')' and '*', write a function to chec ...
- [LeetCode] 678. Valid Parenthesis String 验证括号字符串
Given a string containing only three types of characters: '(', ')' and '*', write a function to chec ...
- 【LeetCode】#344 Reverse String
[Question] Write a function that takes a string as input and returns the string reversed. Example: G ...
- 【LeetCode】606. Construct String from Binary Tree 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:先序遍历 日期 题目地址:https://l ...
- 【LeetCode】394. Decode String 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 日期 题目地址:https://leetcode ...
- 【leetcode】Valid Palindrome
题目简述: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ...
随机推荐
- java并发编程 线程基础
java并发编程 线程基础 1. java中的多线程 java是天生多线程的,可以通过启动一个main方法,查看main方法启动的同时有多少线程同时启动 public class OnlyMain { ...
- 关于DataFram的.values
DataFram类型的变量a,设a有n个样本,m个特征,当执行语句b = a.values后,b为(n, m)的ndarray矩阵类型,当执行c = b.ravel()后,c为(n*m,)维行向量
- flask第一级
#从flask这个包中导入Flask这个类 #Flask这个类是项目的核心,以后很多操作都是基于这个类的对象 #注册url.注册蓝图等都是基于这个类的对象 from flask import Flas ...
- Jetty启动报错排查org.eclipse.jetty.util.MultiException: Multiple exceptions
最近自己搭建了一个spring的项目,使用Maven做项目构建,使用JDK8,为了方便启动就使用jetty作为启动容器,但是却无意间步入了一个坑 [WARNING] Failed startup of ...
- web框架 Spring+SpringMvc+Jpa 纯注解搭建
0.jar包依赖 maven pom.xml <properties> <spring_version>4.3.25.RELEASE</spring_version&g ...
- svn下载项目的时候出现 Path to certificate
svn关联的时候出现这种情况,并且有svn的账号的时候,可以找setting中Version Control 中的Subversion中celar 一下即可,然后再重新下载就会让你重新输入用户名和密码 ...
- Callable+ThreadPoolExecutor实现多线程并发并获得返回值(转)
出处:https://blog.csdn.net/kity9420/article/details/80740466 前言 经常会遇到一些性能问题,比如调用某个接口,可能要循环调用100次,并且需要拿 ...
- Tarjan算法求有向图强连通分量并缩点
// Tarjan算法求有向图强连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> #inc ...
- Android 调用摄像头功能【拍照与视频】
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/ma_hoking/article/details/28292973 应用场景: 在Android开发 ...
- redis 模拟redis server接收信息
一.实现说明 客户端使用jedis正常set值到redis服务器 2. 模拟服务器接收jedis发送的信息 二.jedis客户端代码 package com.ahd.redis; import r ...