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. class Solution {
  4. public:
  5. vector<string> restoreIpAddresses(const string& s) {
  6. vector<string> result;
  7. vector<string> ip; // 存放中间结果
  8. dfs(s, ip, result, 0);
  9. return result;
  10. }
  11. /**
  12. * @brief 解析字符串
  13. * @param[in] s 字符串,输入数据
  14. * @param[out] ip 存放中间结果
  15. * @param[out] result 存放所有可能的IP地址
  16. * @param[in] start 当前正在处理的 index
  17. * @return 无
  18. */
  19. void dfs(string s, vector<string>& ip, vector<string> &result,
  20. size_t start) {
  21. if (ip.size() == 4 && start == s.size()) { // 找到一个合法解
  22. result.push_back(ip[0] + '.' + ip[1] + '.' + ip[2] + '.' + ip[3]);
  23. return;
  24. }
  25. if (s.size() - start > (4 - ip.size()) * 3)
  26. return; // 剪枝
  27. if (s.size() - start < (4 - ip.size()))
  28. return; // 剪枝
  29. int num = 0;
  30. for (size_t i = start; i < start + 3 && i < s.size(); i++) {
  31. num = num * 10 + (s[i] - '0');
  32. if (num < 0 || num > 255) continue; // 剪枝
  33. ip.push_back(s.substr(start, i - start + 1));
  34. dfs(s, ip, result, i + 1);
  35. ip.pop_back();
  36. if (num == 0) break; // 不允许前缀0,但允许单个0
  37. }
  38. }
  39. };

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