题目

image.png
image.png

解题代码

  1. class Solution {
  2. List<String> result = new ArrayList<>();
  3. public List<String> restoreIpAddresses(String s) {
  4. if(s.length() > 12 ) return result; //剪枝操作
  5. backtracking(s,0,0);
  6. return result;
  7. }
  8. public void backtracking(String s, int startIndex, int pointNum ) {
  9. if(pointNum == 3 ) { //逗号数量为3,分割结束
  10. // 判断第四段子字符串是否合法,如果合法就放进result中
  11. if(isValid(s,startIndex,s.length()-1 ) ) {
  12. result.add(s);
  13. }
  14. return ;
  15. }
  16. for(int i = startIndex; i < s.length(); i++ ) {
  17. if(isValid(s,startIndex,i) ) {
  18. s = s.substring(0,i+1 ) + "." + s.substring(i+1 );
  19. pointNum ++;
  20. backtracking(s,i + 2,pointNum); // 插⼊逗点之后下⼀个⼦串的起始位置为i+2
  21. pointNum --;
  22. // 回溯删掉逗点 很巧妙
  23. s = s.substring(0,i+1) + s.substring(i + 2);
  24. } else {
  25. break;
  26. }
  27. }
  28. }
  29. public boolean isValid(String s, int start, int end ) {
  30. if(start > end ) {
  31. return false;
  32. }
  33. if(s.charAt(start) == '0' && start != end ) {
  34. // 0开头的数字不合法
  35. return false;
  36. }
  37. int num = 0;
  38. for(int i = start;i <= end; i++ ) {
  39. if(s.charAt(i) > '9' || s.charAt(i) < '0' ) {
  40. // 遇到⾮数字字符不合法
  41. return false;
  42. }
  43. num = num * 10 + ( s.charAt(i) - '0' ) ;
  44. if(num > 255) {
  45. // 如果⼤于255了不合法
  46. return false;
  47. }
  48. }
  49. return true;
  50. }
  51. }