这题坑特别多,主要有以下几点:

    1. 边界问题,dot 数量按增加来操作,当 dot == 3 时就可以判断末尾字符串是否符合要求,如果符合,就收集即可。当 dot > 3 时,需要 return
    2. 当使用 StringBuilder 存储字符时,需要注意回溯时将 . 移除,但是在收集过程中回溯时则不需要将 . 移除。

      1. class Solution {
      2. List<String> res;
      3. public List<String> restoreIpAddresses(String s) {
      4. if (s == null || s.length() == 0) return new ArrayList<>();
      5. res = new ArrayList<>();
      6. StringBuilder path = new StringBuilder();
      7. backTracking(s, 0, 0, path);
      8. return res;
      9. }
      10. private void backTracking(String s, int pos, int dot, StringBuilder path) {
      11. // System.out.println(String.format("dot: %s, pos: %s", dot, pos));
      12. if (dot > 3) return;
      13. if (dot == 3) {
      14. // 收集
      15. // 判断第四段是否合法
      16. String sub = s.substring(pos, s.length());
      17. if (isValid(sub)) {
      18. path.append(sub);
      19. res.add(path.substring(0, path.length()));
      20. path.setLength(path.length() - sub.length());
      21. }
      22. return;
      23. }
      24. for (int i = pos; i < s.length(); i++) {
      25. String sub = s.substring(pos, i + 1);
      26. if (!isValid(sub)) break;
      27. path.append(sub).append(".");
      28. backTracking(s, i + 1, dot + 1, path);
      29. path.setLength(path.length() - 1 - sub.length());
      30. }
      31. }
      32. private boolean isValid(String s) {
      33. // 首位 0
      34. int len = s.length();
      35. if (len == 0) return false;
      36. if (s.charAt(0) == '0' && len > 1 ) return false;
      37. if (len > 3) return false;
      38. if (Integer.parseInt(s) > 255) return false;
      39. return true;
      40. }
      41. }