话不多说,直接上代码,注释非常清晰!
// 判断输入的括号是否是合法的
function isVaild (str){
//判断输入的括号个数是否为偶数,如果不是偶数直接返回false
if(str.length%2 != 0){
return false
}
//判断输入的最后一个是否为右括号,如果为左括号直接false
else if(str[str.length-1] == "(" || str[str.length-1] == "{" || str[str.length-1] == "["){
return false
}
//判断输入的第一个是否为左括号,如果是右括号直接返回false
else if(str[0] == "}" ||str[0] == ")" ||str[0] == "]"){
return false
}else{
//定义一个临时数组来存放
let arr = [];
//首先循环遍历输入的每个括号
for(let i = 0;i<str.length;i++){
//对每个括号进行判断
switch (str[i]) {
//如果为右括号就判断arr数组的最后一个是否是相同类型的左括号,
//如果是的话就讲arr数组的左括号删除,并且跳出当前for循环,目的是
//不让后面的arr.push()运行
case ")":
if(arr.slice(-1) == "("){
arr.pop()
continue
}
break;
case "}":
if(arr.slice(-1) == "{"){
arr.pop()
continue
}
break;
case "]":
if(arr.slice(-1) == "["){
arr.pop()
continue
}
break;
}
//如果上面的条件都不符合 也就是说输入的是左括号,或者
//输入的是右括号,但是,arr数组的最后一个标签无法预期配对
//就将输入的括号添加至数组arr
arr.push(str[i])
}
//最后判断,如果arr数组的长度为0,就表示上面全部匹配成功,就表示
//输入的括号是合法的
if(arr.length == 0 ){
return true
}
//数组长度不为0,就表示输入的不是合法的
else{
return false
}
}
}
方案2
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
const obj ={
"(":")",
"{":"}",
"[":"]"
}
let stack = [];
for(let i =0;i<s.length;i++){
if(s[i] in obj ){
stack.push(s[i])
}else if(s[i] !== obj[stack[stack.length - 1]]){
return false
}else{
stack.pop()
}
}
return stack.length === 0
};