题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()" 输出:true 示例 2:
输入:s = "()[]{}" 输出:true 示例 3:
输入:s = "(]" 输出:false 示例 4:
输入:s = "([)]" 输出:false 示例 5:
输入:s = "{[]}" 输出:true
提示:
1 <= s.length <= s 仅由括号 '()[]{}' 组成
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解思路
- 左右括号配对原则除了得是同类型,还需要符合就近原则,比如"((",当遇到第一个")"时应该与最后一个"("配对,这符合栈的操作,后进先出。
- 我们遇到左括号就压入栈中待匹配。
- 遇到右括号就去栈顶找是否为可以配对的左括号,配对成功就移除栈顶元素等待配对下一个左括号,配对失败直接返回。
题解代码
* @lc app=leetcode.cn id=20 lang=javascript
*
* [20] 有效的括号
*/
// @lc code=start
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
const n = s.length;
if (n % 2 === 1) {
return false;
}
const stack = [];
const map = new Map([
[")","("],
["}","{"],
["]","["]
]);
for (let si of s) {
//当是某个右括号时,去stack栈顶找是否是配对的左括号
if (map.has(si)) {
//stack为空或栈顶元素与si不是配对的括号类型,则不是有效括号
if (!stack.length || stack[stack.length - 1] !== map.get(si)) {
return false
}
stack.pop();//配对成功移除栈顶元素
}else{
stack.push(si)//si为左括号时推入栈顶等待配对
}
}
return !stack.length;//stack为空栈说明所有的左括号均成功配对
};
// @lc code=end