思路:
首先用字典将三对括号存储,遍历字符串中每个字符,遇到左括号就入栈;遇到右括号就开始判断:是否与栈弹出的顶字符相同。
如果到最后栈被清空,说明全部匹配上了,为真。
class Solution(object): def isValid(self, s): stack=[] #设置一个列表,把该列表当做栈来使用即可 dic={'(':')','{':'}','[':']'} #使用字典存储括号 new_dic = {v : k for k, v in dic.items()} #由于不能直接从value查找到对应的key,采用了字典反转 for char in s: if char in dic.keys(): #左括号就入栈 stack.append(char) elif char in dic.values(): #有右括号的话就进行比较 if stack==[] or new_dic[char]!=stack.pop(): #分别对应'()]'以及'{]'两类情况 return False else: return False #非字典中的输入直接输出错误 return stack==[] #如果栈最后是空的,那么符合要求输出true;如果不是,则输出false, 使用一个条件表达式 mm=Solution() print(mm.isValid('(([]){})'))
复杂度分析:
- 时间复杂度:O(n),因为我们一次只遍历给定的字符串中的一个字符并在栈上进行 O(1)的推入和弹出操作。
- 空间复杂度:O(n),当我们将所有的开括号都推到栈上时以及在最糟糕的情况下,我们最终要把所有括号推到栈上。例如
((((((((((
。
另:
leetcode有一点坑的是,在下列情况:
if stack==[] or new_dic[char]!=stack.pop(): #分别对应'()]'以及'{]'两类情况
如果只考虑匹配写为 if new_dic[char]!=stack.pop():
在遇到'()]'时,会因为stack已经empty而无法继续pop出新元素而语法报错,但示例中并未给出'()]'此类例子。
遇到这种情况时,读者可能会反复对照题目给出的示例,觉得理应通过而百思不得其解。
大家coding时也要仔细,注意因为额外例子所导致的语法错误。