原题描述
给定一个只包括 '(',')','{','}','[',']'
的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
个人解法
JavaScript
/*
* @lc app=leetcode.cn id=20 lang=javascript
*
* [20] 有效的括号
*/
// @lc code=start
var check = function (stack, origin) {
if (stack[stack.length - 1] === '(') {
return origin === ')'
} else if (stack[stack.length - 1] === '{') {
return origin === '}';
} else if (stack[stack.length - 1] === '[') {
return origin === ']';
}
}
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (s) {
const stack = [];
stack.push(s[0]);
for (let i = 1; i < s.length; i++) {
if (check(stack, s[i])) {
stack.pop();
} else {
stack.push(s[i]);
}
}
return stack.length === 0;
};
// @lc code=end
更优解法
var isValid = function(s) {
const n = s.length;
if (n % 2 === 1) {
return false;
}
const pairs = new Map([
[')', '('],
[']', '['],
['}', '{']
]);
const stk = [];
for (let ch of s){
if (pairs.has(ch)) {
if (!stk.length || stk[stk.length - 1] !== pairs.get(ch)) {
return false;
}
stk.pop();
}
else {
stk.push(ch);
}
};
return !stk.length;
};