题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例1
输入:s = "()"
输出:true
示例2
输入:s = "()[]{}"
输出:true
示例3
输入:s = "(]"
输出:false
示例4
输入:s = "([)]"
输出:false
示例5
输入:s = "{[]}"
输出:true
题目分析
验证括号的对称性,括号总共分为三类:()、[]和{},可以利用栈先进后出的特性,将所有左括号(、[、{先入栈,然后再碰到右括号时,让它与栈顶的元素进行匹配,比如当遇到)时,如果栈顶是(,则说明匹配成功,栈顶元素出栈再继续字符串循环的流程,如果匹配错误就直接返回 false。假设要匹配字符串([{}])是否合法,执行流程如下
题解如下
var isValid = function (s) {
let valid = true;
const stack = [];
// 定义字符串匹配 mapper
const mapper = {
"{": "}",
"[": "]",
"(": ")",
};
for (let i in s) {
const v = s[i];
//indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
if (["(", "[", "{"].indexOf(v) > -1) {
//如果是(、[、{ 则入栈
stack.push(v);
} else {
// pop 返回删除的元素。
// 左括号栈顶元素出栈,
const peak = stack.pop();
//判断是否是对应匹配的右括号
if (v !== mapper[peak]) {
return false;
}
}
}
// 遍历结束,如果仍有未匹配完的左括号,返回 false
if (stack.length > 0) return false;
return valid;
};
console.log(isValid('(){)'));
console.log(isValid('(){}'));
console.log(isValid('([{}])'));
总结
这道题有很多种解法,我选择了栈来解决。选择适合自己理解的解法,希望自己继续努力吧!