[路飞]_leetcode-20-有效的括号

简介: leetcode-20-有效的括号

网络异常,图片无法展示
|


「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战


[题目地址][B站地址]


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


有效字符串需满足:


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


示例 1:


输入: s = "()"
输出: true
复制代码


示例 2:


输入: s = "()[]{}"
输出: true
复制代码


示例 3:


输入: s = "(]"
输出: false
复制代码


示例 4:


输入: s = "([)]"
输出: false
复制代码


示例 5:


输入: s = "{[]}"
输出: true
复制代码


提示:


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


本题要我们判断输入字符串中的括号是否都一一对应


那么我们就需要在遇到右括号的时候,判断它前面是否是与之对应的左括号


如果不是,返回 false


但是这里有一个问题,就是当前括号对比成功后,如何不妨碍后续的括号对比,也就是每一个后面的字符,如何找到前面与之对应的字符的位置


这里我们可以用栈来维护所有的左括号,当遇到左括号,入栈


当遇到右括号的时候,此时栈顶字符就是与之对应的字符,判断两个字符是否是对应括号,如果不是,返回 false,否则将栈顶元素弹出,这样就保证了后续有括号遍历到的时候,栈顶元素还是与之对应的字符


解题思路如下:


  1. 创建一个栈,用来后续存储所有的左括号
  2. 为了不针对每一种右括号做一次判断逻辑代码编写,创建一个 obj 维护括号之间的对应关系
  3. 遍历字符串,如果当前字符为左括号,将该字符入栈
  4. 如果当前字符为右括号,判断栈顶元素是否是与之对应的左括号,如果不是,返回 false,否则将栈顶元素弹出,方便后续对比
  5. 如果字符串顺利遍历完成,说明所有的右括号都恰好有与之对应的做括号
  6. 最后判断栈是否为空,如果不为空,说明有多余的左括号,返回 false,否则说明左右括号完全一一对应,返回 true


代码如下:


var isValid = function(s) {
  // 创建栈存储左括号
  const stack = [],
  // 利用obj维护对应关系
  obj = {
    ')':'(',
    ']':'[',
    '}':'{'
  }
  // 遍历字符串
  for(let i = 0;i<s.length;i++){
    switch(s[i]){
      // 如果为左括号,入栈
      case '(':
      case '[':
      case '{':
        stack.push(s[i])
      break;
      // 如果为右括号,判断当前栈顶字符是否是其对应左括号,如果不是,返回 false
      case ')':
      case ']':
      case '}':
        if(stack.length === 0 || stack.pop() !== obj[s[i]]) return false;
      break;
    }
  }
  // 代码来到这里遍历过程中所有右括号都匹配到了对应的左括号
  // 此时如果栈为不为空,说明左括号存在多余情况,反之说明输入字符串有效
  return stack.length === 0
};
复制代码


至此,我们就完成了leetcode-20-有效的括号


如有任何问题或建议,欢迎留言讨论!

相关文章
|
6月前
|
存储 C语言 索引
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
|
10天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
1月前
|
算法 C++
Leetcode第二十二题(括号生成)
这篇文章讨论了如何使用递归算法解决LeetCode第22题“括号生成”的问题,提供了两种C++的实现方法,目的是生成所有有效的括号组合。
16 0
Leetcode第二十二题(括号生成)
|
1月前
|
存储 C++ 容器
Leetcode第二十题(有效的括号)
这篇文章介绍了如何使用栈来解决LeetCode第20题“有效的括号”问题,提供了两种方法:数组栈和容器栈,以及相应的C++代码实现。
16 0
|
3月前
|
算法
LeetCode第22题括号生成
该文章介绍了 LeetCode 第 22 题括号生成的解法,通过回溯算法生成所有可能的括号组合,在递归过程中根据左右括号数量的条件进行剪枝,从而得到有效的括号组合。
LeetCode第22题括号生成
|
3月前
|
存储 算法
LeetCode第20题有效的括号
该文章介绍了 LeetCode 第 20 题有效的括号的解法,通过分析有效括号的特征,使用栈结构存储括号关系,判断遇到右边括号时栈顶是否有匹配的左边括号,从而解决问题,同时总结了栈的先进后出结构可用于解决有规律的符号匹配问题。
LeetCode第20题有效的括号
|
3月前
|
算法 Python
【Leetcode刷题Python】括号匹配问题
一种解决括号匹配问题的Python实现方法,通过计算给定括号串的所有子串的最长合法括号子序列长度之和来确定权值。
25 0
|
3月前
|
机器学习/深度学习 Python
【Leetcode刷题Python】22. 括号生成
本文介绍了了LeetCode题目22的两种Python编程解决方案,题目要求生成所有可能的且有效的括号组合,包括暴力求解和回溯方法。
25 0
|
3月前
|
Python
【Leetcode刷题Python】20. 有效的括号
LeetCode上题目“20. 有效的括号”的Python解决方案,使用栈数据结构来验证括号序列的有效性。具体实现中,会在栈中预先放置一个特殊字符以避免在弹出操作时出现空栈错误,并通过匹配左右括号来判断括号序列是否有效。
42 0
|
5月前
|
算法 Java C语言
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
41 1