leetcode20:有效的括号(逆波兰式)

简介: leetcode20:有效的括号(逆波兰式)

前言


本系列文章为《leetcode》刷题笔记。

刷题平台:力扣中国


题目


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


有效字符串需满足:

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

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

注意空字符串可被认为是有效字符串。


示例 1:


输入: "()"
输出: true


示例 2:

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


示例 3:

输入: "(]"
输出: false


示例 4:

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


示例 5:

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


思路


这是一个典型的逆波兰式,我的思路是利用栈先入后出的特点来解这一题。遍历一遍,遇到左括号就入栈,遇到右括号就出栈,前提是出栈之前需要判断栈顶最后一个元素是否和右括号成对,遇到其他就跳过。


边界条件:


  1. 字符串内的字符串是奇数个,直接返回false(仅适用于 只有 括号的情况,如果有字母就不行了)
  2. 没有左括号,就没有入栈,所以需要判断栈长度
  3. 括号包括号{[]}


时间复杂度 O(N):正确的括号组合需要遍历 1 遍 s;

空间复杂度 O(N):哈希表和栈使用线性的空间大小。


代码


Go

func isLeft(c uint8) bool {
  return ('{' == c) || ('[' == c) || ('(' == c)
}
func isRight(c uint8) bool {
  return ('}' == c) || (']' == c) || (')' == c)
}
func isOk(c1 uint8, c2 uint8) bool {
  return ('{' == c1 && c2 == '}') || ('[' == c1 && ']' == c2) || ('(' == c1 && ')' == c2)
}
func isValid(s string) bool {
  if len(s)%2!=0 {
    return false
  }
  stack := make([]uint8, len(s))
  current := -1
  for i := 0; i < len(s); i++ {
    if isLeft(s[i]) {
      current++
      stack[current] = s[i]
    } else if isRight(s[i]) {
      if current != -1 && isOk(stack[current], s[i]) {
        current--
      } else {
        return false
      }
    }
  }
  return current == -1
}


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