原题地址:. – 力扣(LeetCode)
给定一个只包括'('
,')'
,'{'
,'}'
,'['
,']'
的字符串s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"输出:true
示例2:
输入:s = "()[]{}"输出:true
示例3:
输入:s = "(]"输出:false
使用栈
判断括号的有效性,这是一个非常经典的问题。
由于给定字符串中只包含 ‘(‘,’)’,'{‘,’}’,'[‘,’]’,所以我们不需要额外考虑非法字符的问题。
对于合法的输入字符,关键在于遇到一个“左括号”时,我们会希望在后续的遍历中,遇到一个相同类型的“右括号”将其闭合。
由于规则是:后遇到的左括号,要先闭合,因此我们想到,利用一个栈可以实现这个功能,将左括号放入栈顶,遇到右括号时弹出就可以了。
public boolean isValid(String s) {Deque stack = new LinkedList();for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);// 遇到左括号则压入右括号if (c == '(') {stack.push(')');} else if (c == '{') {stack.push('}');} else if (c == '[') {stack.push(']');} else {// 遇到右括号则出栈,如果和出栈的字符不一致则不满足条件if (stack.isEmpty()) return false;if (!stack.pop().equals(c)) return false;}}// 栈是空的则说明完全匹配return stack.isEmpty();}