20.有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
括号必须以正确的顺序关闭,"()" 和 “()[]{}” 是有效的但是 “(]” 和 “([)]” 不是。
我(我的特点是写代码之前有个大致的思路就开始写,然后边写边改,导致无数个if,else逻辑不清。)
d = {'(':')','{':'}','[':']'}
l = ''
if len(s) == 1 or len(s) == 0:
return False
for i in range(len(s)):
print(s[i])
if s[i] in d:
l+=d[s[i]]
print(l)
if i ==len(s)-1:
return False
elif s[i] == l[len(l)-1:]:
l = l[:len(l)-1]
print(l)
if i == len(s)-1:
if l == '':
return True
else:
return False
else:
return False
别人一目了然
if len(s) % 2 == 1 or len(s) == 0:#这一步真的机智,我只会想到输入一个的状况。。。
return False
d = {'{': '}', '[': ']', '(': ')'}
stack = []
for i in s:
# in stack
if i in d:
stack.append(i)
else:
if not stack or d[stack.pop()] != i:
return False
```
else:
if stack:
return False
return True
```
return stack ==[]#以上四条语句可以用这条语句替代
第三种方法
a = {')':'(', ']':'[', '}':'{'}
l = [None]
for i in s:
if i in a and a[i] == l[-1]:
l.pop()
else:
l.append(i)
return len(l)==1
总结:
1.拿到一个题首先要考虑有几种情况:
1)空和奇数个直接排除
2)剩下偶数个,若第一个就是右括号直接排除,不是右括号再入栈。
2.画个流程图辅助。
3.for else的用法。for循环完后执行else语句块,若for中有break,则跳过else。
4.l[-1]为l的最后一个元素。
Javascript
var isValid = function(s) {
d = {
'(':')',
'[':']',
'{':'}',
};
a = s.split('')
let stack = [];
for(item of a){
if(item in d){
stack.push(d[item]);
}
else{
if (stack.length === 0 || stack.pop() !== item){
return false;
};
};
};
if(stack.length) return false;
return true;
};