括号匹配问题 —— Deque双端队列解法
题目:
给定一个只包括 '(',')','{','}','[',']'?的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
思路:
我思路比较简单,就是从左往右看
如果是 "(" "{" "[" 这三个的话,直接进入队列中
如果遇到 ")" "}" "]" 这三个的话,就去看队列中的最后一个是不是和他匹配,如果是,那就移除最后一个,如果不是,那就直接跳出循环,肯定就不是一个合格的括号啦~(这时候队列里面还有没有匹配上的括号)
tips:可以在最开始加个判断,如果是奇数,就肯定是不合格的括号~
代码如下:
public static boolean isValid(String s) { if (s.length() % 2 == 1) { return false; } Map<String, String> map = new HashMap<String, String>(); map.put(")", "("); map.put("}", "{"); map.put("]", "["); int i = 0; Deque<String> queue = new LinkedList<String>(); while(i < s.length()) { String now = s.substring(i, i+1); if (!queue.isEmpty() && map.containsKey(now)) { if (queue.getLast().equals(map.get(now))) { queue.removeLast(); } else { break ; } } else { queue.offer(now); } i++; } if (queue.isEmpty()) { return true; } else { return false; } }