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

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


    示例 1:
    输入:s = “()”
    输出:true
    示例 2:
    输入:s = “()[]{}”
    输出:true
    示例 3:
    输入:s = “(]”
    输出:false

    解题思路:调用栈

    思路分析:
    遍历字符串中的所有字符

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

  4. 如果遇到了右括号,判断栈是否为空:
  • 2.1、如果栈为空,说明不能构成有效的括号,直接返回false。
  • 2.2、如果栈不为空,栈顶元素出栈,然后判断出栈的这个元素是否等于当前便利的这个右括号,如果不等于说明不匹配,直接返回false,如果匹配就继续遍历下一个字符。
  1. 遍历结束,如果栈为空,说明是完全匹配,即是有效的括号,如果栈不为空,说明不完全匹配,不是有效的括号。

def8799557b78d78e7c649e9b8f0c38.jpg
看代码

  1. // 判断是否是有效括号
  2. export const isAvailableBrackets = (str) => {
  3. let stack = [] // 定义栈
  4. // 定义括号集
  5. const brackets = {
  6. '(': ')',
  7. '[': ']',
  8. '{': '}'
  9. }
  10. const leftBrackets = Object.keys(brackets)
  11. const rightBrackets = Object.values(brackets)
  12. for (let i = 0; i < str.length; i++) {
  13. // 1.如果是左括号,把对应的右括号压栈
  14. // 2.如果是右括号,判断栈是否为空,元素出栈比对
  15. if (leftBrackets.includes(str.charAt(i))) {
  16. stack.push(brackets[str.charAt(i)])
  17. } else if (rightBrackets.includes(str.charAt(i))) {
  18. if (stack.length === 0) {
  19. return false
  20. } else {
  21. let stackTop = stack.pop() // 栈顶元素出栈
  22. if (stackTop === str.charAt(i)) {
  23. continue
  24. } else {
  25. return false
  26. }
  27. }
  28. }
  29. }
  30. // 3.遍历结束之后,判断栈是否为空
  31. if (stack.length === 0) {
  32. return true
  33. } else {
  34. return false
  35. }
  36. }

扩展知识

charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。
方法 charCodeAt() 与 charAt() 方法执行的操作相似,只不过前者返回的是位于指定位置的字符的编码,而后者返回的是字符子串。
语法
stringObject.charCodeAt(index)
参数 描述
index 必需。表示字符串中某个位置的数字,即字符在字符串中的下标。

charAt() 方法可返回指定位置的字符。
语法
stringObject.charAt(index)
参数 描述
index 必需。表示字符串中某个位置的数字,即字符在字符串中的下标