例题

lc 93. 复原IP地址

image.png
思路

  • 递归
  • 三指针

代码
Python代码:

  1. class Solution:
  2. def restoreIpAddresses(self, s: str) -> List[str]:
  3. seg_count = 4
  4. ans = []
  5. segments = [0] * seg_count
  6. def dfs(segId, start):
  7. if segId == seg_count:
  8. if start == len(s):
  9. ip = ".".join(str(s) for s in segments)
  10. ans.append(ip)
  11. return
  12. if start == len(s):
  13. return
  14. # 由于不能有前导零,如果当前数字为 0,那么这一段 IP 地址只能为 0
  15. if s[start] == "0":
  16. segments[segId] = 0
  17. dfs(segId + 1, start + 1)
  18. addr = 0
  19. for end in range(start, len(s)):
  20. addr = addr * 10 + (ord(s[end]) - ord("0"))
  21. if 0 < addr <= 0xFF:
  22. segments[segId] = addr
  23. dfs(segId + 1, end + 1)
  24. else:
  25. break
  26. dfs(0, 0)
  27. return ans

Java三指针:

  1. class Solution {
  2. public List<String> restoreIpAddresses(String s) {
  3. List<String> r = new ArrayList<>();
  4. if(s.length() > 12) return r;
  5. for(int i = 1; i < s.length() && i <= 3; ++i){
  6. for(int j = i; j < s.length() && j <= i + 3; ++j){
  7. for(int k = j; k < s.length() && k <= j + 3; ++k){
  8. String s1 = s.substring(0, i);
  9. String s2 = s.substring(i, j);
  10. String s3 = s.substring(j, k);
  11. String s4 = s.substring(k);
  12. if(f(s1)&&f(s2)&&f(s3)&&f(s4)){
  13. StringBuilder sb = new StringBuilder();
  14. sb.append(s1); sb.append(".");
  15. sb.append(s2); sb.append(".");
  16. sb.append(s3); sb.append(".");
  17. sb.append(s4);
  18. r.add(sb.toString());
  19. }
  20. }
  21. }
  22. }
  23. return r;
  24. }
  25. boolean f(String s){
  26. if(s.length() == 0) return false;
  27. if(s.length() == 1) return true;
  28. if(s.length() > 3) return false;
  29. if(s.charAt(0) == '0') return false;
  30. if(Integer.parseInt(s) <= 255) return true;
  31. return false;
  32. }
  33. }