题目

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

有效字符串需满足:

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

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

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

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

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

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

'()[]'和'([])'这两种有效情况,可以看出,只要右括号前面是左括号,它们一定是一对,可以相互抵消的。
利用栈的思想可以很好的解决题目,有种消消乐的感觉。

def isValid(s):
  # 如果字符串是奇数,那么肯定返回False
  if len(s)%2!=0:
      return False

  hash = {
      ')':'(',
      ']':'[',
      '}':'{'
  }
  stack = []
  for ch in s:
      # 如果是右括号
      if ch in hash:
          # 如果已经空栈且右括号,直接False
          # 如果栈顶的左括号和当前右括号不配对,直接False
          if not stack or stack[-1]!=hash[ch]:
              return False
          # 没空栈,且与栈顶左括号配对,则消除这对括号
          stack.pop()
      else:
          # 如果是左括号,直接入栈
          stack.append(ch)

  # 经过栈的消除,如果是有效括号,应该是空栈
  return not stack

时间复杂度:O(n)
空间复杂度:O(n+∣Σ∣),其中 Σ 表示字符集,本题中字符串只包含6种括号,∣Σ∣=6。栈中的字符数量为 O(n),而哈希表使用的空间为 O(∣Σ∣),相加即可得到总空间复杂度。


Ethan
140 声望11 粉丝

水平较低,只是记录,谨慎参阅


引用和评论

0 条评论