给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
class Solution(object):
def isValid(self, string):
"""
:type s: str
:rtype: bool
"""
# 用数据结构表示栈的时候,可以采用数组或者链表,数组相对实现比较简单
# 定义一个空数组做栈,通过append()和pop()以及len()方法来模仿入栈,出栈,栈的大小
stack = []
# 定义一个数组,用作查找元素
muban = ["()", "[]", "{}"]
# 遍历字符串的每一个元素
for i in range(0, len(string)):
# 然后将每一个元素入栈
stack.append(string[i])
# 当遇到栈的大小超过2时,并且栈中最后两个元素在用作查找元素的模板中时,就弹出栈的最上面两个元素
if len(stack) >= 2 and stack[-2]+stack[-1] in muban:
stack.pop()
stack.pop()
# 当for循环遍历完之后,判断此时栈中元素是否完全弹出,如果是就返回true
return len(stack) == 0
sl = Solution()
st = sl.isValid('{[]}')
print(st)
总结:
1.思路是不断地将字符串的元素入栈,然后如果遇到了栈的大小大于2并且栈的最顶层两个元素合在一起的字符串符合用于查找元素的模板中的任意元素,就弹出这两个元素,否则就继续入栈,直到所有的元素都被入栈。最后面通过判断栈的大小是否为0来判断是否符合题意。
2.用数组来表示一个栈的时候,可以使用append()和pop()以及len()方法来模仿入栈,出栈,栈的大小。append()是将要添加的元素放到数组的最后面,pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。因此符合栈的结构和功能。
3.在python中可以使用in符号判断指定的元素是否存在于列表和元组中,甚至是字典(Python 字典 in 操作符用于判断键是否存在于字典中,如果键在字典dict里返回true,否则返回false)。值得注意的是,在判断列表和元组时有些许的不同,以下是一些实验的结果。
>>> 't' in ['r,'t']
True
>>> 't' in ('r','t')
True
>>> 't' in ['t/c','r']
False
>>> 't' in ('t/c','r')
False
>>> 't' in ['tEST']
False
>>> 't' in ('tEST')
True
由这些结果,我们可以发现一个很神奇的现象,在元组只有一个元素的时候,python在使用in判断的时候,只要元组中的元素有这个符合的字符串即可。