声明:
今天是第6道题,判断输入的只包含括号的字符串是否有效,有效的条件是左右括号是否匹配完毕。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
解法1。首先根据题干条件,如果字符串为空则返回TRUE,如果长度为奇数则返回FALSE。先用字典记录左右括号一一匹配关系(左:右),然后对字符串进行遍历的时候如果是左括号就入栈,如果是右括号,如果栈里没有元素或者弹出栈里最后一个入栈的元素对应的键值不等于这个右括号的话,就返回FALSE,遍历完毕后,再判断stack如果为空,则说明所有字符已经匹配完毕,没有落单,返回TRUE。
# V 1.0,能提交
class Solution:
def isValid(self, s):
if(s is None or len(s) == 0):
return True
if len(s) % 2 == 1:
return False
stack = []
dictionary = {'(':')','[':']','{':'}'}
for each in s:
if each in dictionary:
stack.append(each)
else:
if not stack or dictionary[stack.pop()] != each:
return False
return stack == []
解法2。这种解法和上一种解法类似,但是简化了操作,对左右括号的操作顺序反过来了,字典定义的左右映射关系也是反过来的,前面的两个判断语句是一样的。主要流程就是:对字符串遍历-如果是右括号且此右括号对应的左括号与stack里最后一个入栈的元素相等,则弹出这个元素并继续遍历,若是左括号则入栈。遍历完毕后判断stack里是否只有None值(左右括号已匹配完毕),即判断长度是否为1,是则返回TRUE。
# V 2.0,能提交
class Solution:
def isValid(self, s):
if(s is None or len(s) == 0):
return True
if len(s) % 2 == 1:
return False
stack = [None] # 此时stack长度为1
# print(len(stack))
dictionary = {')':'(',']':'[','}':'{'}
for each in s:
if each in dictionary and dictionary[each] == stack[-1]:
stack.pop()
else:
stack.append(each)
return len(stack) == 1 # 长度为1的情况是stack里只剩下None(初始化时的情况)
结尾
解法1:https://blog.csdn.net/qq_34364995/article/details/80274117
解法2:https://blog.csdn.net/qq_34364995/article/details/80274117