来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses/
一、题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
- 1 <= s.length <= 104
- s 仅由括号 '()[]{}' 组成
二、题解
解题源码: 链接
\ | 时间复杂度 | 空间复杂度 |
---|---|---|
栈 | O(n) | O(n) |
2.1.栈
2.1.1.算法步骤
- 栈先入后出特点恰好与本题括号排序特点一致,即若遇到左括号入栈,遇到右括号时将对应栈顶左括号出栈,则遍历完所有括号后 stack 仍然为空;
- 建立哈希表 dic 构建左右括号对应关系:key 左括号,value 右括号;这样查询 2 个括号是否对应只需 O(1) 时间复杂度;建立栈 stack,遍历字符串 s 并按照算法流程一一判断。
2.1.2.动画演示
2.1.3.复杂度分析
- 时间复杂度:O(n),正确的括号组合需要遍历 11 遍 s。
- 空间复杂度:O(n)。哈希表和栈使用线性的空间大小。
2.1.4.参考代码
解题源码: 链接
public class Id_0020_Stack implements Id_0020 {
@Override
public boolean isValid(String s) {
if(s.isEmpty())
return true;
Stack<Character> stack=new Stack<Character>();
for(char c:s.toCharArray()){
if(c=='(')
stack.push(')');
else if(c=='{')
stack.push('}');
else if(c=='[')
stack.push(']');
else if(stack.empty()||c!=stack.pop())
return false;
}
return stack.empty();
}
}
以上是个人学习记录,如有不正确请多多包涵,也欢迎评论告诉我,谢谢~
评论区