1 class Solution { 2 public List<String> restoreIpAddresses(String s) { 3 List<String> addresses = new ArrayList<>(); 4 StringBuilder tempAddress = new StringBuilder(); 5 doRestore(0, tempAddress, addresses, s); 6 return addresses; 7 } 8 9 private void doRestore(int k, StringBuilder tempAddress, List<String> addresses, String s) { 10 if (k == 4 || s.length() == 0) { 11 if (k == 4 && s.length() == 0) { 12 addresses.add(tempAddress.toString()); 13 } 14 return; 15 } 16 for (int i = 0; i < s.length() && i <= 2; i++) { 17 if (i != 0 && s.charAt(0) == '0') { 18 break; 19 } 20 String part = s.substring(0, i + 1); 21 if (Integer.valueOf(part) <= 255) { 22 if (tempAddress.length() != 0) { 23 part = "." + part; 24 } 25 tempAddress.append(part); 26 doRestore(k + 1, tempAddress, addresses, s.substring(i + 1)); 27 tempAddress.delete(tempAddress.length() - part.length(), tempAddress.length()); 28 } 29 } 30 } 31 }
回溯法,合法的ip地址,一共分四段,每段的数值在0~255之间。因此程序需要判断分段的位置,也就是加“.”的位置。
例如:25525511135,要进行分段,判断顺序如下:
先分成2.5.5.2,但后续还有字符(5511135),因此这种划分不合法,第一次进入10行之后,不满足11行判断条件,则执行14行返回。
再分成2.5.5.25,但后续还有字符(511135),因此也不合法。
再分成2.5.5.255,但后续还有字符(11135),因此也不合法。
因此第三段不能只分一位数字5,而分为两位数字52:分成2.5.52.5不合法,2.5.52.55不合法,2.5.52.551,最后一段不满足第21行的条件,也不合法。
因此第三段不能分两位数字52,而尝试分为三位数字2.5.525.***,525超过了255,也不合法。
那第二段就需要调整,分成2.55.***,按照这种方式依次尝试“加点”分段,当划分到255.255.11.135时,得到一个合法解。
继续划分,会得到另一个合法解:255.255.111.35。
至此,程序得出所有合法解。