经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
【算法】LeetCode算法题-Valid Parentheses
来源:cnblogs  作者:小川94  时间:2018/10/20 15:12:58  对本文有异议

这是悦乐书的第147次更新,第149篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第6题(顺位题号是20),给定一个只包含字符'(',')','{','}','['和']'的字符串,确定输入字符串是否有效。输入的字符串必须使用相同类型的括号关闭左括号,并且以正确的顺序关闭左括号。如果输入空串,返回true。例如:

输入: "()"
输出: true

输入: "()[]{}"
输出: true

输入: "([)]"

输出: false

输入: "{[]}"
输出: true

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

利用字符串的替换方法。左括号和右括号必须一起出现,无论其里层还是外层有多少层,如"{()}","()"的外面有一层"{}",或者"{}"的里层是"()",将里面的"()"替换为空串,剩下"{}"再替换为空串,最后为空串,返回true。

  1. public boolean isValid(String s) {
  2. boolean flag = false;
  3. if (s.isEmpty()) {
  4. return true;
  5. }
  6. String s2 = s;
  7. for (int i=0; i<s.length()/2; i++) {
  8. s2 = s2.replaceAll("\\(\\)", "");
  9. s2 = s2.replaceAll("\\{\\}", "");
  10. s2 = s2.replaceAll("\\[\\]", "");
  11. if (s2.length() == 0) {
  12. return true;
  13. }
  14. }
  15. return flag;
  16. }

03 第二种解法

利用栈后进先出的特点。将左括号开头的字符依次存入栈中,遇到右括号时,从栈中取出进栈的数据,如果是一对左右括号,继续循环,反之返回false。
字符串"{()}",将其拆分为四个字符'{','(',')','}',第1次循环进栈字符是'{',第2次循环进栈字符是'(',第三次循环遇到右括号')',从栈中取出数据'(',判断是否为一对。依次往后循环判断。

  1. public boolean isValid2(String s) {
  2. Stack<Character> pare_stack = new Stack<Character>();
  3. for (int i = 0; i < s.length(); i++) {
  4. char c = s.charAt(i);
  5. switch(c) {
  6. case '(':
  7. case '[':
  8. case '{':
  9. pare_stack.push(c);
  10. break;
  11. case ')' :
  12. if (pare_stack.isEmpty()) {
  13. return false;
  14. } else {
  15. if (pare_stack.pop() == '(') {
  16. break;
  17. } else {
  18. return false;
  19. }
  20. }
  21. case ']' :
  22. if (pare_stack.isEmpty()) {
  23. return false;
  24. } else {
  25. if (pare_stack.pop() == '[') {
  26. break;
  27. } else {
  28. return false;
  29. }
  30. }
  31. case '}' :
  32. if (pare_stack.isEmpty()) {
  33. return false;
  34. } else {
  35. if (pare_stack.pop() == '{') {
  36. break;
  37. } else {
  38. return false;
  39. }
  40. }
  41. }
  42. }
  43. return pare_stack.isEmpty();
  44. }

04 第三种解法

利用数组。遇到左括号,将右括号放进数组;遇到右括号,取数组最后一位匹配,匹配上则删除数组最后一位元素继续循环,匹配不上则返回false。

  1. public boolean isValid3(String s) {
  2. List<String> nextClose = new ArrayList<>();
  3. if (s.length() == 0) {
  4. return true;
  5. }
  6. if (")]}".indexOf(s.charAt(0)) != -1) {
  7. return false;
  8. }
  9. for (int i = 0; i < s.length(); i++) {
  10. try {
  11. switch (s.charAt(i)) {
  12. case '(':
  13. nextClose.add(")");
  14. break;
  15. case '[':
  16. nextClose.add("]");
  17. break;
  18. case '{':
  19. nextClose.add("}");
  20. break;
  21. case ')':
  22. if (nextClose.get(nextClose.size() - 1) != ")") {
  23. return false;
  24. } else {
  25. nextClose.remove(nextClose.size() - 1);
  26. }
  27. break;
  28. case ']':
  29. if (nextClose.get(nextClose.size() - 1) != "]") {
  30. return false;
  31. } else {
  32. nextClose.remove(nextClose.size() - 1);
  33. }
  34. break;
  35. case '}':
  36. if (nextClose.get(nextClose.size() - 1) != "}") {
  37. return false;
  38. } else {
  39. nextClose.remove(nextClose.size() - 1);
  40. }
  41. break;
  42. }
  43. } catch (ArrayIndexOutOfBoundsException e) {
  44. return false;
  45. }
  46. }
  47. return nextClose.size() == 0;
  48. }

05 小结

此题解法远不止上面这三种,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号