题目链接:点击即可
题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
思路
1、利用栈结构,利用压栈弹栈来匹配数据,创建一个空数组。
2、遍历字符串,如果是左括号就压栈,如果是右括号就弹栈,并检查该右括号是否匹配栈顶的左括号。
3、匹配的方法:ES5的话可以用两个数组建立对应关系,更清晰明了。但是数量大的话占空间较多,用indexOf效率不高。
ES6的方法用Map对象创建键值对来建立对应关系,用set、has、get方法获取键或者值。
4、遍历结束,栈为空则全部匹配。
ES5用数组配对的写法
var isValid = function(s) {
var arr1 = ["(","[","{"];
var arr2 = [")","]","}"];
var arr3 = [];
for(var i=0;i<s.length;i++){
if(arr1.indexOf(s[i])!=-1){
arr3.push(s[i]);
}else{
let str = arr3.pop()
if(str!==arr1[arr2.indexOf(s[i])]){{
return false
}}
}
}
if(arr3.length!=0){
return false;
}
return true;
};
ES6用Map对象配对的写法
var isValid = function(s) {
let mappings = new Map([['(',')'],['[',']'],['{','}']]);
let arr = [];
for(let i=0;i<s.length;i++){
if(mappings.has(s[i])){
arr.push(s[i])
}else{
let str = arr.pop()
if(mappings.get(str)!==s[i]){
return false
}
}
}
if(arr.length>0){
return false
}
return true;
};