目录
1 题目
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
2 输入输出
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
3 解法 使用栈
栈后进先出特点恰好与本题括号排序特点一致,即若遇到左括号入栈,遇到右括号时将栈顶元素出栈,如果栈顶元素与右括号匹配,继续遍历,否则是无效括号;遍历完所有括号后 stack 仍然为空=》有效,否则无效。
下面为两种代码,第一种所需空间大,时间也长
1)使用数组存储左右括号
2)使用Map存储对应的括号
左括号为键,右括号为值。(时间和空间更优)
4 代码
/**
* @param {string} str
* @return {boolean}
* 功能:有效括号 使用栈的方法,可以使用数组存储左右括号,也可以使用多个if(switch语句),当项数多(括号多)的时候,多个if代码太长。。。
*/
var isValid = function(str) {
/*if(str.length === 0 || str === " "){//空字符串或者长度为0时
return true;
}*/
let stack = []; //js中一般使用数组实现栈
let left = ["(", "[", "{"]; //左括号
let right = [")", "]", "}"]; //右括号
let len = str.length; //性能优化,不必每次循环都计算一次str.length
for(let i = 0; i < len; i++){//遍历字符串,如果为左括号,则入栈,否则栈顶元素出栈并与该元素比较
if(left.indexOf(str[i]) !== -1){ //左括号
stack.push(str[i]);
}
else if(right.indexOf(str[i]) !== -1){ //右括号
if(stack.length === 0){ //栈为空时
return false;
}
else { //栈长度不为空时
if(left.indexOf(stack.pop()) !== right.indexOf(str[i])){ //弹出栈顶元素,若其不能与该元素配对
return false;
}
}
}
}
//如果为空字符串时,那么栈一直为空,不需要特意写判断为空的代码
return !stack.length; //栈为空时,返回true,否则返回false
};
/**
* @param {string} str
* @return {boolean}
* 功能:有效括号 使用栈的方法,结合数据结构Map
*/
var isValid_2 = function(str) {
/*if(str.length === 0 || str === " "){//空字符串或者长度为0时
return true;
}*/
let stack = []; //js中一般使用数组实现栈
let map = new Map([ //使用map查询速度还有内存消耗比数组低
["(", ")"], //键用做括号表示,对应值为对应的右括号
["[", "]"],
["{", "}"]
]);
let len = str.length; //性能优化,不必每次循环都计算一次str.length
for(let i = 0; i < len; i++){//遍历字符串,如果为左括号,则入栈,否则栈顶元素出栈并与该元素比较
if(map.has(str[i])){ //左括号,
stack.push(str[i]);
}
else{ //右括号
if(stack.length === 0){ //栈为空时
return false;
}
else { //栈长度不为空时
if(map.get(stack.pop()) !== str[i]){ //弹出栈顶元素,若其不能与该元素配对
return false;
}
}
}
}
//如果为空字符串时,那么栈一直为空,不需要特意写判断为空的代码
return !stack.length; //栈为空时,返回true,否则返回false
};
console.log(isValid_2("()"));
参考:力扣
百里于2020年5月23日
如果有错,请您指出!如有侵权,请联系我删除!