题目(来源于力扣)
思路
首先分析问题判断字符串有效,即排除所有字符串无效的情况,而根据题意字符串无效的情况有三种:
1、左右字符串类型不匹配 如' { ( ) ] '
2、左边符号多余 如‘ { { {()} ’
3、右边符号多余 如‘ [ ( ) ] ] ] ’
解决:利用栈来解决,利用栈的先进后出特性,来保证符号正确的闭合顺序。
循环字符串中的每个字符,遇到左边类的符号就把相应的右边类符号通过push()来压入栈中,
遇到右边类的符号就与通过pop()弹出栈的元素进行比较,看是否匹配;最后通过返回栈的长度
是否为0来排除符号多余的情况。利用数组的push()和pop()方法来模拟压栈和弹栈以及栈的
先进后出
代码
var isValid = function(s) {
// 定义一个数组来模拟栈
const stack = [];
for (let i = 0; i < s.length; i++) {
// 获取字符串中的每个字符
let char = s.charAt(i)
// 判断是否为(,{,[,若是在栈中添加对应的另一半
if(char == '('){
stack.push(')')
}else if(char == '{'){
stack.push('}')
}else if(char == '['){
stack.push(']')
}else{
// 遇到是右边符号的情况,判断其与栈中的是否相同,相同则可以匹配,不同则不匹配
if(char !== stack.pop()){
return false;
}
}
}
// 不直接返回true,要排除字符串长度为奇数的情况
return stack.length==0;
}
总结
常利用数据结构中的栈来解决类似有效的括号这种问题