题目
有效的括号 给定一个只包括 '(',')','{','}','[',']'
的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
复制代码
示例 2:
输入:s = "()[]{}"
输出:true
复制代码
示例 3:
输入:s = "(]"
输出:false
复制代码
示例 4:
输入:s = "([)]"
输出:false
复制代码
示例 5:
输入:s = "{[]}"
输出:true
复制代码
提示:
1 <= s.length <= 104
s
仅由括号 '()[]{}'
组成
题解
解题分析
解题思路
--> 😔 <-- 采用栈的方式处理
- 定义一个 Stack;
- 如果识别为某括号,压栈反括号;
- 如果是 '(' 压栈 ')'
- 如果是 '[' 压栈 ']'
- 如果是 '{' 压栈 '}'
- 如果是别的字符串,那么就对应了出栈的顺序,比如:
{[()]}
会压入}])
然后,执行到循环i = 3
那么出栈,栈顶元素)
, 且对应为当前的字符串数组,继续下一个下标出栈。 - 如果字符串中的遍历
i
下标的字符串和出栈的元素不匹配。那么返回false
. 简化后的代码就是stack.isEmpty() || c != stack.pop()
. - 如果最后栈顶为空(即栈为空)那么该字符串合法。
复杂度
时间复杂度 O(N)
空间复杂度 O(N)
解题代码
题解代码如下(代码中有详细的注释说明):
class Solution {
public boolean isValid(String s) {
// 1. 定义一个 Stack
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '(') {
// 如果是 '(' 压栈 ')'
stack.push(')');
} else if (c == '[') {
// 如果是 '[' 压栈 ']'
stack.push(']');
} else if (c == '{') {
// 如果是 '{' 压栈 '}'
stack.push('}');
} else if (stack.isEmpty() || c != stack.pop()) {
// 如果栈为空,或者出栈的顺序不是,当前字符返回 false
return false;
}
}
// 栈为空
return stack.isEmpty();
}
}
作者:心城以北
链接:https://juejin.cn/post/7088687475681394702
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。