开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
LeetCode20:有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
提示:
- s 仅由括号 '()[]{}' 组成
思路分析
栈先入后出特点恰好与本题括号排序特点一致,即若遇到左括号入栈,遇到右括号时将对应栈顶左括号出栈,则遍历完所有括号后 stack 仍然为空。
思路是遍历字符,遇到左括号,就入栈,遇到右括号,尝试与栈顶元素匹配,匹配成功就出栈,匹配失败,说明遇到了无法匹配的右括号,直接返回fase退出。如果全都是合法的括号,都匹配成功了,最后栈应该是空的。
需要注意一些边界,当栈是空的时候(要么一直匹配到,要么之前的都成功匹配了),如遇右括号,肯定 是无法匹配的,直接返回false。
还可以做剪枝,先看字串长度,如果是奇数,就直接返回false。奇数个不可能全都匹配,必然有一个落单。
算法代码
public boolean isValid(String s) {
if ((s.length() & 0x01) != 0) {
return false;
}
Stack<Character> parenthesisStack = new Stack<>();
for (char ch : s.toCharArray()) {
if (ch == '{' || ch == '(' || ch == '[') {
parenthesisStack.push(ch);
} else if (!parenthesisStack.empty()){
char top = parenthesisStack.peek();
if (top == '{' && ch == '}') {
parenthesisStack.pop();
} else if (top == '(' && ch == ')') {
parenthesisStack.pop();
} else if (top == '[' && ch == ']') {
parenthesisStack.pop();
} else {
return false;
}
} else {
return false;
}
}
return parenthesisStack.empty();
}
算法复杂度
- 时间复杂度:
- 空间复杂度:
在掘金(JUEJIN)一起进步,一起成长!