链接:https://leetcode-cn.com/problems/valid-parentheses/
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
队列的特点是先进先出,栈的特点是先进后出。
对于括号的有效性判断,我们可以使用栈来解决。如果字符串有一个左括号,那我们希望后面会出现一个同类的右括号,来与之配对。
思路:
如果字符串为奇数时,直接判断为 False,不再进行后续判断;
建立一个哈希表,以右括号为 key,左括号为 value;
遍历字符串:
当我们遍历完所有字符串,如果栈为空的话,说明所有左括号和右括号都匹配上了,返回 True;如果栈不为空,那说明无法匹配,返回 False。
当然 hash 表的 key 和 value 有多种设置方法,比如我们可以设置 hash={'(':1,')':-1,'{':2,'}':-2,'[':3,']':-3},这样判断的条件就是 hash[i]+hash[stack[-1]] 是否等于 0 ,如果等于 0 代表匹配上了,不等于 0 则没有匹配上。
时间复杂度:O(n),遍历了一遍字符串。空间复杂度:O(n),哈希表和栈使用了线性空间的大小,最坏情况下,假如输入字符串是 '(((((((',栈的大小将是输入字符串的长度。
class Solution:
def isValid(self, s: str) -> bool:
if len(s) %2 == 1:
return False
hash = {')':'(',']':'[','}':'{'}
stack=[]
for i in s:
if stack and i in hash:
if stack[-1] == hash[i]:
stack.pop()
else:
return False
else:
stack.append(i)
return not stack
如果觉得文章不错,希望大家可以关注我噢,点赞、收藏、在看、分享就再好不过了。如果有任何建议和问题,可以在下方给我留言,我会不定期更新更多的文章,祝我们终将自由。