93. 复原IP地址

  1. class Solution {
  2. private static int SEG_COUNT = 4; // ipv4地址下的IP地址分为4段
  3. public List<String> restoreIpAddresses(String s) {
  4. List<String> ans = new ArrayList<>();
  5. if (s == null || s.length() <= 3)
  6. return ans;
  7. int[] segments = new int[SEG_COUNT]; // 保存每段的十进制数形式
  8. dfs(s, 0, segments, 0, ans);
  9. return ans;
  10. }
  11. private void dfs(String s, int index, int[] segments, int segNum, List<String> ans) {
  12. // 完成搜索并且获得每段的十进制数字形式
  13. if (segNum == SEG_COUNT) {
  14. if (index == s.length()) {
  15. StringBuilder currentIP = new StringBuilder();
  16. for (int i = 0; i < SEG_COUNT; i++) {
  17. currentIP.append(segments[i]);
  18. if (i != SEG_COUNT - 1)
  19. currentIP.append(".");
  20. } // for
  21. ans.add(currentIP.toString());
  22. } // if
  23. return;
  24. } // if
  25. // 没有找到4段就搜索完了整个字符串
  26. if (index == s.length())
  27. return;
  28. if (s.charAt(index) == '0') {
  29. // 直接确定当前的这段为0
  30. segments[segNum] = 0;
  31. dfs(s, index + 1, segments, segNum + 1, ans);
  32. }
  33. int addr = 0; //
  34. for (int end = index; end < s.length(); end++) {
  35. addr = addr * 10 + (s.charAt(end) - '0');
  36. if (addr > 0 && addr <= 255) {
  37. segments[segNum] = addr;
  38. dfs(s, end + 1, segments, segNum + 1, ans);
  39. } else {
  40. break;
  41. }
  42. }
  43. }
  44. }