JS 刷 Leetcode:20.有效的括号

简介: JS 刷 Leetcode:20.有效的括号

1. 题目

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

有效字符串需满足:

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

 

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

 

提示:

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

2. 解法一: 栈

思路:新建一个栈,遇到左括号就入栈,遇到与之相同的就出栈直到最后判断栈是否为空

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
  const l = s.length;
  if (l % 2 === 1) return false;
  const stack = [];
  for (let i = 0; i < l; i++) {
    const c = s[i];
    if (["(", "[", "{"].includes(c)) {
      stack.push(s[i]);
    } else if (c === ")") {
      if (stack.pop() !== "(") return false;
    } else if (c === "]") {
      if (stack.pop() !== "[") return false;
    } else if (c === "}") {
      if (stack.pop() !== "{") return false;
    }
  }
  return stack.length === 0;
};

image.png
复杂度分析:

  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

3. 解二: 使用Map更优雅

var isValid = function (s) {
  const l = s.length;
  if (l % 2 === 1) return false;
  const stack = [];
  const map = new Map();
  map.set("(", ")");
  map.set("[", "]");
  map.set("{", "}");
  for (let i = 0; i < l; i++) {
    if (map.has(s[i])) stack.push(s[i]);
    else if (!map.has(s[i]) && s[i] !== map.get(stack.pop())) return false;
  }
  return stack.length === 0;
};
相关文章
|
算法 Go 索引
【LeetCode 热题100】回溯:括号生成 & 组合总和(力扣22 / 39 )(Go语言版)
本文深入解析了LeetCode上的两道经典回溯算法题:**22. 括号生成**与**39. 组合总和**。括号生成通过维护左右括号数量,确保路径合法并构造有效组合;组合总和则允许元素重复选择,利用剪枝优化搜索空间以找到所有满足目标和的组合。两者均需明确路径、选择列表及结束条件,同时合理运用剪枝策略提升效率。文章附有Go语言实现代码,助你掌握回溯算法的核心思想。
661 0
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
501 4
LeetCode第22题括号生成
该文章介绍了 LeetCode 第 22 题括号生成的解法,通过回溯算法生成所有可能的括号组合,在递归过程中根据左右括号数量的条件进行剪枝,从而得到有效的括号组合。
LeetCode第22题括号生成
|
算法 C++
Leetcode第二十二题(括号生成)
这篇文章讨论了如何使用递归算法解决LeetCode第22题“括号生成”的问题,提供了两种C++的实现方法,目的是生成所有有效的括号组合。
323 0
Leetcode第二十二题(括号生成)
|
存储 算法
LeetCode第20题有效的括号
该文章介绍了 LeetCode 第 20 题有效的括号的解法,通过分析有效括号的特征,使用栈结构存储括号关系,判断遇到右边括号时栈顶是否有匹配的左边括号,从而解决问题,同时总结了栈的先进后出结构可用于解决有规律的符号匹配问题。
LeetCode第20题有效的括号
|
存储 C++ 容器
Leetcode第二十题(有效的括号)
这篇文章介绍了如何使用栈来解决LeetCode第20题“有效的括号”问题,提供了两种方法:数组栈和容器栈,以及相应的C++代码实现。
243 0
|
JavaScript
js 区分中英文输入法(如中英文括号)
js 区分中英文输入法(如中英文括号)
381 4
|
JavaScript
js 校验括号——括号不可嵌套且需成对出现
js 校验括号——括号不可嵌套且需成对出现
246 2
|
算法 Java C语言
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
285 1
|
前端开发 JavaScript
JSX 中带有大括号的 JavaScript
JSX 中带有大括号的 JavaScript