第二道:20.有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
第一次解题思路[看题解后]:
- 使用栈的思想,先进后出,可以完美匹配’{[]}'这种情况
- 如果元素是字符的左半部分则放入栈中(此时不知道左半部分是否可以匹配所以放入栈中),等待出现右半部分时对栈顶元素进行匹配,也就是说匹配离他最近的元素(所以使用栈进行存储),如果不匹配则是说明字符串匹配失败;
- 时间复杂度o(n),空间复杂度o(n)
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let arr =[],template={')':'(','}':'{',']':'['}
for(let char of s){
if(template[char]==undefined){
arr.push(char)
}else if(template[char] === arr[arr.length-1]){
arr.pop()
}
}
if(arr.length>0){
return false
}else{
return true
}
};
解答错误:主要原因是在检查字符串是否是左字符串,出现右字符串后是否与存储字符串匹配,如果不匹配则直接返回false,此时没有返回false
第二次解题思路:
- 主要添加第一次错误原因的逻辑
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let arr =[],template={')':'(','}':'{',']':'['}
for(let char of s){
if(template[char]==undefined){
arr.push(char)
}else if(template[char] === arr[arr.length-1]){
arr.pop()
}else{
return false
}
}
if(arr.length>0){
return false
}else{
return true
}
};
运行时间:76ms;内存消耗:38.9mb
总结考点:
- 本题主要考点为使用栈的先进后出的思想,可以使用数组操作最后一个 元素进行模拟栈思想
- 左右字符匹配的对应值写成对象的模式
备注:第一次新建:2020-11-18