Skip to content

20、有效的括号

js
;(function () {
  /**
   * 20. 有效的括号
   * 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
   *
   * 有效字符串需满足:
   *      左括号必须用相同类型的右括号闭合。
   *      左括号必须以正确的顺序闭合。
   *
   * 输入:s = "()"
   * 输出:true
   *
   * 输入:s = "()[]{}"
   * 输出:true
   *
   * 输入:s = "(]"
   * 输出:false
   *
   * 输入:s = "([)]"
   * 输出:false
   *
   * 输入:s = "{[]}"
   * 输出:true
   *
   */
  // // 定义obj接口类型
  // interface obj {
  //     [keyName: string]: string
  // }
  // let obj: obj = {
  //     '(': ')',
  //     '{': '}',
  //     '[': ']'
  // }
  function isValid(s: string): boolean {
    // 方法一
    // // 1. 字符长度必须是双数
    // if (s.length % 2 !== 0) {
    //     return false
    // }
    // // 2. 遍历:肯定有单个成对的 '()' '{}' '[]'的出现,将其成对剔除出去,如果最后字符串变成空,则true
    // let reg = /(\(\))|(\{\})|(\[\])/;
    // while(reg.test(s)){
    //     s =  s.replace(/(\(\))|(\{\})|(\[\])/g, '')
    // }
    // return s.length === 0 || false

    // 方法二:栈(官方标准做法)
    interface obj {
      [keyName: string]: string;
    }
    let obj: obj = {
      // start: end
      '(': ')',
      '{': '}',
      '[': ']'
    }
    if (s.length % 2 !== 0) {
      return false
    }
    let stack: string[] = []
    for (let i of s) {
      // 如果start 和 i(end)对应上了,则pop,否则push
      if (stack.length > 0) {
        // obj[stack[stack.length - 1]]: stack[stack.length - 1]栈顶元素, obj[栈顶元素] --> 判断是否是start中的一个
        i === obj[stack[stack.length - 1]] ? stack.pop() : stack.push(i)
      } else {
        stack.push(i)
      }
    }
    return !stack.length
  }

  let s0 = '()]'
  let s1 = '()'
  let s2 = '()[]{}'
  let s3 = '(]'
  let s4 = '([)]'
  let s5 = '{[]}'
  // console.log(isValid(s0))
  // console.log(isValid(s1))
  // console.log(isValid(s2))
  // console.log(isValid(s3))
  // console.log(isValid(s4))
  console.log(isValid(s5))
})()