每天一道算法题(2018.12.2)

题目:
给定一个只包含"(", “)”, ”[“,”]“, ”{“, "}"的字符串,判断字符串是否有效,有效字符串需要满足:
左括号必须用相同类型的右括号闭合;
左括号必须以正确的顺序闭合。
例子:
输入:{}{}[]
输出:true

输入:{[}{]}
输出:false

输入:{[()]}
输出:true

刚刚看到题的时候,感觉还是挺复杂的,不过动手画一画,就能发现正确的字符串是有规律的。什么规律呢?

  • 先有左括号,再有相应的右括号(也就是说,不能凭空出现一个右括号,而前面没有相应的左括号)
  • 从左往右遍历字符串,如果遇到左括号,我们暂时还不能判断,一旦出现右括号,那么它必须与最近的一个没有被匹配过的左括号匹配,否则字符串就出错
  • 到了最后,左右括号应当全部匹配完

python 代码如下:

def isValid(s):
	stack = []
	dict = {'[':']', '{',:'}', '(':')'}
	for c in s:
		if c in dict.values():
			stack.append(c)
		elif c in dict.keys():
			if stack==[] or dict[c]!=stack.pop():
				return False
		else:
			return False
	return stack==[]

代码比较简单,这里就不再举相亲的例子,只是简要介绍一个流程:
主要进程是一个遍历,另有一个数组用来存储。
每次遇到一个左括号我们就把它放到数组stack中,如果遇到右括号,我们就需要判断一下了:
首先判断用来存储的数组是不是为空,如果为空,那自然就没有相应的左括号了;也判断这个数组的最后一个元素是不是和当前遇到的右括号匹配,如果不匹配,那也可以直接输出False了,如果匹配,那就去掉数组里最后这个左括号,因为它已经被匹配掉了。
到了最后,我们再判断用来存储的数组是否为空,如果为空,那么说明左右括号都刚好被匹配完,输出True,如果不为空,那就是有问题。

再强调一遍,这个题的题眼在于:
如果遇到右括号,那么它必须与最近的一个没有被匹配过的左括号匹配。

更多算法文章:
不含重复项的最长子串
相亲问题
小偷问题
合并问题

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值