前言
思考了许久用了暴力解法,看了看官方解法觉得特别有意思
题目简介
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
示例
输入: "()" 输出: true
输入: "()[]{}" 输出: true
输入: "([)]" 输出: false
题解
这题的解题思路相当于是一维的连连看游戏,不断地消除相邻的成对左右括号,如果最后全部消除,就是有效的括号,反之无效。所以可以使用「栈」
这一数据结构来解决
var isValid = function(s) {
const n = s.length;
//这里如果长度为奇数直接返回false就行了 奇数不可能两两配对的
if (n % 2 === 1) {
return false;
}
const pairs = new Map([
[')', '('],
[']', '['],
['}', '{']
]);
const stk = [];
s.split('').forEach(ch => {
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;
};