有效的括号
题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
解答
我的分析
一句话总结题目
左右符号按顺序闭合
自己的解法思路
1.设置对比的初始化的值
2.依次往后比,找到对应的那个值
3.找到的那个值的index,是否是当前index+1?
我的答案
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let point_map = new Map();
point_map.set('(',1);
point_map.set(')',2);
point_map.set('{',3);
point_map.set('}',4);
point_map.set('[',5);
point_map.set(']',6);
let com_value = s[0];
for(let i=1;i<s.length;i++){
if(point_map.get(com_value)-point_map.get(s[i])!=-1) {return false}
else{
com_value = s[i+1];
continue;
}
}
return true
};
//结果不太对。。。
标准答案
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
const n = s.length;
if(n%2==1){
return false;
}
const pairs = new Map([
[')','('],
[']','['],
['}','{']
]);
const stk = [];
for(let ch of s){
if(pairs.has(ch)){
if(!stk.length || stk[stk.length - 1] !== pairs.get(ch)){
return false;
}
stk.pop();
}
else{
stk.push(ch);
}
}
return !stk.length;
};
答案分析
1,特殊情况:当位数为奇数时,则直接为无效的括号(false)。
2,一般情况:两两比较,找到左半边(符号)放入栈中,再一一比较栈中的值是否在哈希表中有对应值,最后看栈中是否有值来判断是否为有效的括号。
- 设置一个哈希表用来存对应关系
- 将左半边的符号存入栈中
- 判断栈中是否在哈希表中有对应值,且等于栈中的值。不等于直接false(只要找到了就释放栈中值。)
- 最后判断栈中是否还有值。(未匹配上的)
有值:代表无法找到对应符号
结论
自我总结
栈?
栈是限制在表的一端进行插入和删除运算的线性表;操作在栈顶进行。
特点:先进后出
常用方法:
- push:栈顶插入新元素
- pop:删除栈顶元素
- length:返回栈的长度
引申思考
(猜测?)
借助栈的特点,将相关数据(1v1)在栈里面比较。
若符合了条件,从栈中删除,保证栈中的值一直是需要对比的值(不符合条件or未对比的值)。
保证了不相关的数据不再处理。
题目来源:力扣(LeetCode)