匹配有效的括号

569 阅读2分钟

1、问题描述

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。

  2. 左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"

输出:true

示例 2:

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

输出:true

示例 3:

输入:s = "(]"

输出:false

2、解题思路:调用栈

思路分析:

遍历字符串中的所有字符

  1. 如果遇到了左括号,就把对应的右括号压栈(比如遇到了字符‘(’,就把‘)’压栈)

  2. 如果遇到了右括号,判断栈是否为空:

    • 2.1、如果栈为空,说明不能构成有效的括号,直接返回false。

    • 2.2、如果栈不为空,栈顶元素出栈,然后判断出栈的这个元素是否等于当前便利的这个右括号,如果不等于说明不匹配,直接返回false,如果匹配就继续遍历下一个字符。

  3. 遍历结束,如果栈为空,说明是完全匹配,即是有效的括号,如果栈不为空,说明不完全匹配,不是有效的括号。

图片来自网络(侵删)

3、代码实现

// 判断是否是有效括号
export const isAvailableBrackets = (str) => {
  // 定义栈
  let stack = []
  // 定义括号集
  const brackets = {
    '(': ')',
    '[': ']',
    '{': '}'
  }
  const leftBrackets = Object.keys(brackets)
  const rightBrackets = Object.values(brackets)
  
  for (let i = 0; i < str.length; i++) {
    // 1. 如果是左括号,把对应的右括号压栈
    // 2. 如果是右括号,判断栈是否为空,元素出栈比对
    if (leftBrackets.includes(str.charAt(i))) {
      stack.push(brackets[str.charAt(i)])
    } else if (rightBrackets.includes(str.charAt(i))) {
      if (stack.length === 0) {
        return false
      } else {
        // 栈顶元素出栈
        let stackTop = stack.pop()
        if (stackTop === str.charAt(i)) {
          continue
        } else {
          return false
        }
      }
    }
  }
  
  // 3. 遍历结束之后,判断栈是否为空
  if (stack.length === 0) {
    return true
  } else {
    return false
  }
}

4、扩展知识

charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。

方法 charCodeAt() 与 charAt() 方法执行的操作相似,只不过前者返回的是位于指定位置的字符的编码,而后者返回的是字符子串。

4.1、charCodeAt 语法

stringObject.charCodeAt(index)

参数 描述

index 必需。表示字符串中某个位置的数字,即字符在字符串中的下标。

charAt() 方法可返回指定位置的字符。

4.2、charAt 语法

stringObject.charAt(index)

参数 描述

index 必需。表示字符串中某个位置的数字,即字符在字符串中的下标

🎈🎈🎈

欢迎掘友们点赞收藏关注转发, 蟹蟹😊