充分利用了栈先进先出的特点
题目
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串
示例
示例 1: 示例 2: 示例 3: 示例 4: 示例 5:
考察知识点
栈、字符串
核心思想
方法一:基于栈实现
1、初始化栈 S。 2、一次处理表达式的每个括号。 3、如果遇到开括号,我们只需将其推到栈上即可。这意味着我们将稍后处理它,让我们简单地转到前面的 子表达式。 4、如果我们遇到一个闭括号,那么我们检查栈顶的元素。如果栈顶的元素是一个 相同类型的 左括号,那么我们将它从栈中弹出并继续处理。否则,这意味着表达式无效。 5、如果到最后我们剩下的栈中仍然有元素,那么这意味着表达式无效。
STACK-0.png
LeetCode题解
Python版本
独立实现的基于栈的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 class Stack : def __init__ (self ): """ initialize stack """ self.items = [] def __str__ (self ): return str (self.items) def isEmpty (self ): """ Return Stack is empty or not :return: bool """ return len (self.items) == 0 def push (self, item ): """ Push one item into Stack :param item: Object :return: None """ self.items.append(item) def pop (self ): """ Return newest item push into stack :return: Object """ return self.items.pop() def peek (self ): """ Return newest item without stack change :return: Object """ return self.items[-1 ] def size (self ): """ Return the size of stack """ return len (self.items)class Solution : def isValid (self, s: str ) -> bool: if len (s) % 2 != 0 : return False open_bracket = ['(' , '{' , '[' ] close_bracket = [')' , '}' , ']' ] break_pairs = { ")" : "(" , "}" : "{" , "]" : "[" } stack = Stack() for bracket in s: if bracket in open_bracket: stack.push(bracket) elif bracket in close_bracket and stack.size() != 0 and break_pairs[bracket] == stack.peek(): stack.pop() else : return False if stack.size() == 0 : return True else : return False
时间复杂度:\(O(n)\) ,因为我们一次只遍历给定的字符串中的一个字符并在栈上进行 \(O(1)\) 的推入和弹出操作。 空间复杂度:\(O(n)\) ,当我们将所有的开括号都推到栈上时以及在最糟糕的情况下,我们最终要把所有括号推到栈上。例如 ((((((((((
。
有效语法糖
1、栈的声明、初始化、插入、删除,详情见“DS_栈.md”。
class ListNode : def __init__ (self, x ): self.val = x self.next = None