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。

至此,程序得出所有合法解。

posted on 2019-06-10 15:06  Sempron2800+  阅读(142)  评论(0)    收藏  举报