题目:
题目类别:栈
难度:容易
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
1、 左括号必须用相同类型的右括号闭合。
2、左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
解题过程:
想了五分钟没想出来
答案:
解法一:巧妙地用了python里面的replace函数,程序简单清晰
class Solution:
def isValid(self, s):
while '{}' in s or '()' in s or '[]' in s:
s = s.replace('{}', '')
s = s.replace('[]', '')
s = s.replace('()', '')
return s == ''
解法二:栈,散列表
解题思路:
1、算法原理:
- 栈的先入后出的的特点和本题寻找字符串中有效括号的特点一致,从字符串的左边开始,遇到左括号就入栈,遇到对应的右括号则左括号就出栈,最后全为有效括号的话,栈为空。
- 建立哈希表,key为左括号,value为右括号,这样查找括号是否对应只需要O(1)时间复杂度
2、算法流程:
- 判断字符串s中的字符c是否属于哈希表中的key,属于哈希表中的key则说明是左括号,将左括号入栈,如果不属于哈希表中的key,则把栈顶出栈,查找栈顶在哈希表中对应的value也就是有括号是否等于字符c,不等于就提前返回False。循环结束,判断stack是否只有元素‘?’。
3、提前返回 false
-
提前返回优点: 在迭代过程中,提前发现不符合的括号并且返回,提升算法效率。
-
解决边界问题:
- 栈 stack 为空: 此时 stack.pop() 操作会报错;因此,我们采用一个取巧方法,给 stack 赋初值 “?” ,并在哈希表 dic 中建立 key:′?′,value:′?′key: ‘?’ 的对应关系予以配合。此时当 stack 为空且 c 为右括号时,可以正常提前返回 false;
- 字符串 s 以左括号结尾: 此情况下可以正常遍历完整个 s,但 stack 中遗留未出栈的左括号;因此,最后需返回 len(stack) == 1,以判断是否是有效的括号组合。
4、复杂度分析
时间复杂度 O(N)O(N)O(N):正确的括号组合需要遍历 111 遍 s;
空间复杂度 O(N)O(N)O(N):哈希表和栈使用线性的空间大小。
#stack.append(c) c入栈
#stack.pop() 栈顶出栈
class Solution:
def isValid(self, s: str) -> bool:
dic = {'{': '}', '[': ']', '(': ')', '?': '?'}
stack = ['?']
for c in s:
if c in dic: stack.append(c)
elif dic[stack.pop()] != c: return False
return len(stack) == 1