LeetCode20 有效的括号
题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
方法
1.辅助栈法
用hashmap保存模板,然后依次放入栈中,用栈判断顺序
- 时间复杂度:O(n)
- 空间复杂度:O(n+m),m为模板数量
Java版本:
class Solution {
public boolean isValid(String s) {
if(s.length()<=0){
return true;
}
Map map = new HashMap();
map.put('}','{');
map.put(']','[');
map.put(')','(');
Stack stack = new Stack();
for(char c:s.toCharArray()){
if(!stack.isEmpty()&&map.get(c)==stack.peek()){
stack.pop();
}else{
stack.push(c);
}
}
if(stack.isEmpty()){
return true;
}
return false;
}
}
Js版本:
var isValid = function(s) {
const n = s.length;
if(n%2===1) return false;
const map = new Map([
[")","("],
["]","["],
["}","{"]
]);
const stack = [];
for(let ch of s){
if(map.has(ch)){
if(!stack.length||stack[stack.length-1]!==map.get(ch)){
return false;
}
stack.pop();
}else{
stack.push(ch);
}
}
return !stack.length;
};
2. 替换法
依次替换掉字符串中的()、{}和[]
- 时间复杂度:O(n)
- 空间复杂度:O(1)
Java版本:
class Solution {
public boolean isValid(String s) {
int length = s.length() / 2;
for (int i = 0; i < length; i++) {
s = s.replace("()", "").replace("{}", "").replace("[]", "");
}
return s.length() == 0;
}
}
Js版本:
var isValid = function(s) {
const n = s.length /2;
for(let i=0;i<n;i++){
s = s.replace("()","").replace("{}","").replace("[]","");
}
return !s.length;
};
分类:
LeetCode Hot100
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理