有效的括号

384 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目描述


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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

 

示例 1:

输入: s = "()"
输出: true

示例 2:

输入: s = "()[]{}"
输出: true

示例 3:

输入: s = "(]"
输出: false

示例 4:

输入: s = "([)]"
输出: false

示例 5:

输入: s = "{[]}"
输出: true

 

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

题目解释

这题比较简单,但容易出错

之前想法比较简单,遍历每个字符,找到左括号,就用indexof 查找右括号,截取字符串,当字符串为'' ,就代表字符串是合法的。但是忽略掉一种情况

(}{)

如上所示,当检测到'(',我会查找')',截取掉字符串会把'}{'忽略掉。

错误的代码如下:

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    let len = s.length;
    if( len % 2 != 0){
        return false;
    }

    let obj = {
        "{":"}",
        "(":")",
        "[":"]",
    }

    for(var i in obj){
        //key 出现的第一个位置
        let keyNum = s.indexOf(i);
        //value 出现的第一个位置
        let valueNum = s.indexOf(obj[i]);

        if(keyNum > -1  && valueNum > -1){
            //左右括号对调
            if(keyNum > valueNum){
                return false;
            }

            //存在key 查找value出现的第一个位置
            s = s.substring(valueNum+1);
            if(!s){
                return true;
            }
        }else{
            return false;
        }
    }

    return true;

};

查阅了官方的解题思路,我觉得用栈可能会更好点。

解法1 栈

  • 设置一个队列stk存储 括号
  • 判断当前括号的括号 是左括号还是右括号
  • 左括号直接存进队列stk
  • 右括号 根据map 的key 找出value,对比下跟stk最后一个值是否一样
  • 一样就把stk最后一个值删掉,进入下一个循环
  • 不一样,说明这个不是合法的。
/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    let len = s.length;
    if( len % 2 != 0){
        return false;
    }

    let map = new Map([
        [')', '('],
        [']', '['],
        ['}', '{']
    ]);
    let stk = []
    for(var i of s){
        if(map.has(i)){
            //当字符串是右括号,可以查找左括号 并删除
             if(stk && stk.slice(-1)[0] === map.get(i)){
                 //删除stk最后一个值
                 stk.pop();
             }else{
                 return false
             }

        }else{
            //左括号 进队列
            stk.push(i);
        }
    }


    return stk.length==0;

};

image.png