Restore IP Addresses

描述

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

For example:Given "25525511135",

return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)

分析

必须要走到底部才能判断解是否合法,深搜。

代码

  1. // Restore IP Addresses
  2. // 时间复杂度O(n^4),空间复杂度O(n)
  3. public class Solution {
  4. public List<String> restoreIpAddresses(String s) {
  5. List<String> result = new ArrayList<>();
  6. List<String> ip = new ArrayList<>();; // 存放中间结果
  7. dfs(s, ip, result, 0);
  8. return result;
  9. }
  10. /**
  11. * 解析字符串
  12. * @param[in] s 字符串,输入数据
  13. * @param[out] ip 存放中间结果
  14. * @param[out] result 存放所有可能的IP地址
  15. * @param[in] start 当前正在处理的 index
  16. * @return
  17. */
  18. private static void dfs(String s, List<String> ip,
  19. List<String> result, int start) {
  20. if (ip.size() == 4 && start == s.length()) { // 找到一个合法解
  21. result.add(ip.get(0) + '.' + ip.get(1) + '.' +
  22. ip.get(2) + '.' + ip.get(3));
  23. return;
  24. }
  25. if (s.length() - start > (4 - ip.size()) * 3)
  26. return; // 剪枝
  27. if (s.length() - start < (4 - ip.size()))
  28. return; // 剪枝
  29. int num = 0;
  30. for (int i = start; i < start + 3 && i < s.length(); i++) {
  31. num = num * 10 + (s.charAt(i) - '0');
  32. if (num < 0 || num > 255) continue; // 剪枝
  33. ip.add(s.substring(start, i + 1));
  34. dfs(s, ip, result, i + 1);
  35. ip.remove(ip.size() - 1);
  36. if (num == 0) break; // 不允许前缀0,但允许单个0
  37. }
  38. }
  39. public static void main(String[] args) {
  40. Solution s = new Solution();
  41. s.restoreIpAddresses("1111");
  42. }
  43. }

原文: https://soulmachine.gitbooks.io/algorithm-essentials/content/java/dfs/restore-ip-addresses.html