const isValids = s => {
//思路
// 1 如果在字符串开通街舞找到反括号那么不匹配!
// 2 如果在字符串中括号成对出现出现了错误的括号嵌套,就是说,上一个左括号必须匹配下一个同类型的右括号!
// 3 如果括号不是成对出现的则也不匹配!
//创建函数接受一个s的变量 判断一下参数存在并且是一个字符串,否则抛错!
if (!s || typeof s !== 'string') {
throw new Error('请为函数提供一个字符串!');
}
let lel = [...'({[<']; //声明左括号的数组
let rgl = [...')}]>']; //声明右括号的数组
let arr = []; //声明一个缓存左括号的数组
let k = 0; //左括号素组的自定义下标
let re = 1; //声明一个用于判断的结果
let len = s.length; //声明一个字符串的length
if (lel.includes(s[len - 1]) || rgl.includes(s[0])) {
return false;
} //如果在字符串的开头和结尾括号是反的直接返回false
for (let i = 0; i < len; i++) {
//循环字符串
if ([...lel, ...rgl].includes(s[i])) {
//如果在所有的括号字符串中找的到字符
if (lel.includes(s[i])) {
//如果匹配到左括号就直接在数组中缓存上左括号出现的下标
arr[k] = i;
k++; //同时缓存的数组k++
}
rgl.forEach((ele, index) => {
//循环右括号数组
if (ele === s[i]) {
//如果在右括号数组中找到一个右括号
if (s[arr[k - 1]] === lel[index]) {
//这里判断是不是成对的括号 ,因为左右括号的数组长度相同 括号也是成对匹配的 ,右括号的下标能取的到对应的左括号符号
//这里还有一个逻辑只有上一个括号和下一个括号是一对的那么括号匹配成立
arr.splice(k - 1, 1); //找到了就把成对的上一个括号删除
k--; //下标也建一下防止数组塌陷
} else {
//反之不满足条件
re = 0; //不匹配
}
}
});
}
}
if (k !== 0) {
//如果k不等于0代表缓存左括号的数组还有没匹配到同类型右括号的括号
re = 0; //结果是false
}
if (re === 0) {
//提供返回值
return false;
} else {
return true;
}
};
//测试
console.log(isValids('{({}[])}<<<<>>>>'), '----------', '{({}[])}<<<<>>>>');
console.log(isValids('{()}]'), '----------', '{()}]');
