这是悦乐书的第147次更新,第149篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第6题(顺位题号是20),给定一个只包含字符'(',')','{','}','['和']'的字符串,确定输入字符串是否有效。输入的字符串必须使用相同类型的括号关闭左括号,并且以正确的顺序关闭左括号。如果输入空串,返回true。例如:
输入: "()"
输出: true
输入: "()[]{}"
输出: true
输入: "([)]"
输出: false
输入: "{[]}"
输出: true
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
利用字符串的替换方法。左括号和右括号必须一起出现,无论其里层还是外层有多少层,如"{()}","()"的外面有一层"{}",或者"{}"的里层是"()",将里面的"()"替换为空串,剩下"{}"再替换为空串,最后为空串,返回true。
public boolean isValid(String s) { boolean flag = false; if (s.isEmpty()) { return true; } String s2 = s; for (int i=0; i<s.length()/2; i++) { s2 = s2.replaceAll("\\(\\)", ""); s2 = s2.replaceAll("\\{\\}", ""); s2 = s2.replaceAll("\\[\\]", ""); if (s2.length() == 0) { return true; } } return flag;}
03 第二种解法
利用栈后进先出的特点。将左括号开头的字符依次存入栈中,遇到右括号时,从栈中取出进栈的数据,如果是一对左右括号,继续循环,反之返回false。
字符串"{()}",将其拆分为四个字符'{','(',')','}',第1次循环进栈字符是'{',第2次循环进栈字符是'(',第三次循环遇到右括号')',从栈中取出数据'(',判断是否为一对。依次往后循环判断。
public boolean isValid2(String s) { Stack<Character> pare_stack = new Stack<Character>(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); switch(c) { case '(': case '[': case '{': pare_stack.push(c); break; case ')' : if (pare_stack.isEmpty()) { return false; } else { if (pare_stack.pop() == '(') { break; } else { return false; } } case ']' : if (pare_stack.isEmpty()) { return false; } else { if (pare_stack.pop() == '[') { break; } else { return false; } } case '}' : if (pare_stack.isEmpty()) { return false; } else { if (pare_stack.pop() == '{') { break; } else { return false; } } } } return pare_stack.isEmpty();}
04 第三种解法
利用数组。遇到左括号,将右括号放进数组;遇到右括号,取数组最后一位匹配,匹配上则删除数组最后一位元素继续循环,匹配不上则返回false。
public boolean isValid3(String s) { List<String> nextClose = new ArrayList<>(); if (s.length() == 0) { return true; } if (")]}".indexOf(s.charAt(0)) != -1) { return false; } for (int i = 0; i < s.length(); i++) { try { switch (s.charAt(i)) { case '(': nextClose.add(")"); break; case '[': nextClose.add("]"); break; case '{': nextClose.add("}"); break; case ')': if (nextClose.get(nextClose.size() - 1) != ")") { return false; } else { nextClose.remove(nextClose.size() - 1); } break; case ']': if (nextClose.get(nextClose.size() - 1) != "]") { return false; } else { nextClose.remove(nextClose.size() - 1); } break; case '}': if (nextClose.get(nextClose.size() - 1) != "}") { return false; } else { nextClose.remove(nextClose.size() - 1); } break; } } catch (ArrayIndexOutOfBoundsException e) { return false; } } return nextClose.size() == 0;}
05 小结
此题解法远不止上面这三种,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

本文首发于我的个人公众号:悦乐书,转载请注明出处!