LeetCode | 20 ValidParentheses
分析
- 括号成对出现,键值对类型
- 括号字符序列嵌套出现,不能错位,顺序具有对称性
为什么不用数组这种数据结构来记录数量?因为这种方法不能保证括号的正确顺序。例如,字符串'({[)}]'会被认为是有效的。
栈解决有效括号问题
- 当遇到一个左括号时,我们需要记住它,以便在后续遇到相应的右括号时能够正确地匹配
- 当遇到一个右括号时,我们需要检查最近的一个左括号是否与之匹配
进栈和出栈,相当于完成了一次镜像反射。在括号匹配这种具有顺序性和对称性的结构问题上,栈完美符合其要求。
队列:遵循FIFO原则,适用于需要按照元素加入顺序处理数据的场景
栈:遵循LIFO原则,适用于需要按照元素加入的逆序处理数据的场景
拓展
LeetCode 1047,这个消消乐问题跟本题有点类似,不过这道题不需要逆序,最好用队列来做
主类
public class ValidParentheses {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
Map<Character, Character> parenthessesMap = new HashMap<>();
parenthessesMap.put(')', '(');
parenthessesMap.put('}', '{');
parenthessesMap.put(']', '[');
for (char c : s.toCharArray()) {
if (parenthessesMap.containsValue(c)) {
// 如果是左括号,压入栈
stack.push(c);
} else if (parenthessesMap.containsKey(c)) {
if (stack.isEmpty() || !stack.pop().equals(parenthessesMap.get(c))) {
return false;
}
} else {
return false;
}
}
return stack.isEmpty();
}
}
测试类
public class ValidParenthesesTest {
@Test
public void test_ValidParentheses() {
ValidParentheses validParentheses = new ValidParentheses();
System.out.println(validParentheses.isValid("(())"));
System.out.println(validParentheses.isValid("(()]])"));
System.out.println(validParentheses.isValid("({}{}())"));
}
}