20. 有效的括号
这一题的思路就是一个辅助栈。需要注意几个地方:
首先是"({)}"不是有效的括号
关键就是注意到一点,括号不管多少层,一定是这样的{({[ [] ]})},一定能找到一个右与左对称起来。因此使用一个栈来进行处理,遇到左就存,遇到右就出,如果不对的话直接return false。
问题在于边界的处理:
在栈为空的情况下来的如果是右括号的话应该直接false,一种是单独判断,另一种是我们放入一个人为的括号? ?,因此就算最后一个来,他也一定不是需要的,可以安全的unwrap
pub fn isMatch(&self, s: String) -> bool {if (s.len() & 1) == 1 { return false; }use std::collections::HashMap;let map = HashMap::from([('(', ')'), ('{', '}'), ('[', ']'), ('?', '?')]);// 使用一个辅助栈let mut stack = vec!['?'];let s = s.chars();for c in s {// 遇见左括号直接放入if map.contains_key(&c) { stack.push(c); }// 提前放入了一个值放置查询为空else if *map.get(&stack.pop().unwrap()).unwrap() != c {return false;}}stack.len() == 1}
