开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
1.描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
- 1 <= s.length <= 10^4
- s 仅由括号 '()[]{}' 组成
2.分析
使用map建立映射关系:左括号为key,右括号为value
使用辅助栈,利用先进后出的特点
遍历字符串,如果mapping中有此key(说明这是个左括号),获取该key对应的value,放入栈中,如果没有(说明是右括号),出栈并与当前值做对比,如果相等则配对成功
遍历结束时检查栈是否为空,如果不为空说明还有未配对的左括号
注意栈存储的是右括号,并不是实际意义的左括号进行配对,因为配对关系已经通过mapping建立了
3.AC代码
var isValid = function (s) {
//建立映射关系:左括号为key,右括号为value
const mapping = new Map();
mapping.set("(", ")");
mapping.set("[", "]");
mapping.set("{", "}");
//辅助栈
const stack = [];
//遍历字符串
for (let i = 0; i < s.length; i++) {
//如果mapping中有此key(说明这是个左括号)
if (mapping.has(s[i])) {
//获取该key对应的value,放入栈中
stack.push(mapping.get(s[i]));
} else {//如果没有,说明是右括号
//出栈,与当前值做对比
if (stack.pop() !== s[i]) {
return false;
}
}
}
//循环结束时,如果stack不为空,说明有左括号没配对
return stack.length == 0 ? true : false;
}
参考
执行2ms,运用ASCII值判断左右括号是否匹配 - 有效的括号 - 力扣(LeetCode)
栈的先进后出,map 思路: 栈保存左括号,map-key保存右括号,遇到右括号判断是否配对并出栈 - 有效的括号 - 力扣(LeetCode)