有效的括号

106 阅读2分钟

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

问题描述

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
需要满足以下要求:

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

示例:

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

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

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

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

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

解题过程

function brackets( symbol ) {
  let obj = {
    '(':')',
    '{':'}',
    '[':']'
  };
  let newArr = [];
  for(let i=0; i<symbol.length; i++) {
    if(obj[symbol[i]]) {
      newArr.push(symbol[i]);
    } else {
      let last = newArr[newArr.length - 1];
      if(obj[last] === symbol[i]) {
        newArr.pop();
      }else{
        return false;
      }
    }
  }
  return newArr.length===0;
}
console.log(brackets('([]){'))

从题目我们可以知道,字符串是由'(',')','{','}','[',']'这里的一个或者多个拼接而成的,所以,我们可以先利用这些括号声明一个对象obj,括号的左边作为键、括号的右边作为值这样一一对应起来;
声明一个变量newArr存放括号;
循环传进来的字符串,方便取到所有括号;判断循环到的半边括号是不是对象obj的键,若是键的话那就证明是括号的左边,并且能取出值,然后可以把它push到数组newArr进去;
若不是对象的obj的键,那就证明是括号的右半边部分,那就取出数组的最后一个元素(这个元素就是括号的左半边部分),再根据这个元素从对象obj找出对应右边的部分,再和这次循环到的元素(知道是括号的右半边部分)一起对比,若是相同,则证明数组最后一个元素和这次循环到的元素是一对括号,可以把最后一个元素从数组中删除;若是不相同,则可以 return false 出去。
或者,循环遍历完之后,都没又出现不同的,括号之间也两两配对成功,newArr里面的元素也被清空了,长度为0了,则可以 return true 出去。