算法学习自记录/有效的括号

91 阅读2分钟

有效的括号


题目

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

解答

我的分析

一句话总结题目

左右符号按顺序闭合

自己的解法思路

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)

链接来源:leetcode.cn/problems/va…