摘要:后进先出很重要,一定要把后进先出说清楚。栈是缓存,不确定的先存起来,确定了结果以后再拿出去。栈是动态的线性数据结构。
题解 | 「力扣」第 20 题:有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
s仅由括号'()[]{}'组成
思路分析:
把「后进先出」说清楚。
- 遍历到左括号的时候,在它的右边一定需要一个 对应的 右括号与之匹配。因此还不能确定结果的括号需要先「缓存」起来;
- 根据这道问题的特点,后遍历到的括号先匹配,因此当前是数据结构「栈」的应用场景。
参考代码 1:
import java.util.ArrayDeque;
import java.util.Deque;
public class Solution {
public boolean isValid(String s) {
int len = s.length();
// 特殊情况判断
if ((len % 2) == 1) {
return false;
}
char[] charArray = s.toCharArray();
Deque<Character> stack = new ArrayDeque<>();
for (char c : charArray) {
switch (c) {
case '(':
stack.addLast(')');
break;
case '[':
stack.addLast(']');
break;
case '{':
stack.addLast('}');
break;
default:
if (stack.isEmpty() || stack.removeLast() != c) {
return false;
}
break;
}
}
return stack.isEmpty();
}
}
参考代码 2:
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Map;
public class Solution {
public boolean isValid(String s) {
int len = s.length();
if (len == 0) {
return true;
}
// 奇数长度一定不是有效括号
if ((len % 2) == 1) {
return false;
}
char[] charArray = s.toCharArray();
Map<Character, Character> hashMap = new HashMap<>();
hashMap.put(')', '(');
hashMap.put(']', '[');
hashMap.put('}', '{');
Deque<Character> stack = new ArrayDeque<>();
for (char c : charArray) {
// 如果遍历到右括号,检查是否匹配
if (hashMap.containsKey(c)) {
// 栈为空和栈顶与当前不匹配都不能称之为"有效"
if (stack.isEmpty() || !hashMap.get(c).equals(stack.removeLast())) {
return false;
}
} else {
// 遍历到左括号就加入栈
stack.addLast(c);
}
}
return stack.isEmpty();
}
}