20. 有效的括号

这一题的思路就是一个辅助栈。需要注意几个地方:
首先是"({)}"不是有效的括号
关键就是注意到一点,括号不管多少层,一定是这样的{({[ [] ]})},一定能找到一个右与左对称起来。因此使用一个栈来进行处理,遇到左就存,遇到右就出,如果不对的话直接return false。
问题在于边界的处理:
在栈为空的情况下来的如果是右括号的话应该直接false,一种是单独判断,另一种是我们放入一个人为的括号? ?,因此就算最后一个来,他也一定不是需要的,可以安全的unwrap
image.png

  1. pub fn isMatch(&self, s: String) -> bool {
  2. if (s.len() & 1) == 1 { return false; }
  3. use std::collections::HashMap;
  4. let map = HashMap::from(
  5. [('(', ')'), ('{', '}'), ('[', ']'), ('?', '?')]
  6. );
  7. // 使用一个辅助栈
  8. let mut stack = vec!['?'];
  9. let s = s.chars();
  10. for c in s {
  11. // 遇见左括号直接放入
  12. if map.contains_key(&c) { stack.push(c); }
  13. // 提前放入了一个值放置查询为空
  14. else if *map.get(&stack.pop().unwrap()).unwrap() != c {
  15. return false;
  16. }
  17. }
  18. stack.len() == 1
  19. }