20. 有效的括号 + 栈 + 括号匹配
20. 有效的括号
LeetCode_20
题目描述
相似题目
题号 | 题目 | 备注 |
---|---|---|
20 | 有效的括号 | 栈 |
22 | 括号生成 | dfs |
5 | 最长回文子串 | dp |
647 | 回文子串 | dp |
32 | 最长有效括号 | dp |
678 | 有效的括号字符串 | 栈、dp |
方法一:使用常规思路-使用栈匹配括号
class Solution {
public boolean isValid(String s) {
int len = s.length();
if((len & 1) == 1)
return false;
Stack<Character> sta = new Stack<>();
Map<Character, Character> map = new HashMap<>();
map.put('(', ')');
map.put('{', '}');
map.put('[', ']');
for(int i=0; i<len; i++){
char ch = s.charAt(i);
if(sta.isEmpty())
sta.push(ch);
else{
if(ch == map.getOrDefault(sta.peek(), '#')){//注意这里不能直接使用map.get方法,因为我们的map只存储了三种情况,实际上可能会出现6种字符
sta.pop();
}else sta.push(ch);
}
}
return sta.isEmpty();
}
}
方法二:更高效解法
- 本题可以扩展一下思维,map中存储反括号和正括号对,因为一旦出现了反括号,栈顶的元素一定要是正括号,否则匹配必定失败。
- 要注意初始栈为空的情况。
class Solution {
public boolean isValid(String s) {
int len = s.length();
if((len & 1) == 1)
return false;
Stack<Character> sta = new Stack<>();
Map<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put('}', '{');
map.put(']', '[');
for(int i=0; i<len; i++){
char ch = s.charAt(i);
if(map.containsKey(ch)){
if(sta.isEmpty() || sta.peek() != map.get(ch))
return false;
sta.pop();
}else{
sta.push(ch);
}
}
return sta.isEmpty();
}
}
Either Excellent or Rusty