题目
有效的括号给定一个只包括 '(',')','{','}','[',']'
的字符串 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(); } }
提交后反馈结果如下:
网络异常,图片无法展示
|