93.复原IP地址 -day29
思路和算法
由于有效 IP 地址由 4 个整数组成,因此需要在字符串 s 中插入 3 个点得到有效的 IP 地址。可以使用回溯得到所有可能的有效 IP 地址。
回溯过程中需要记录当前的起始下标 start 和片段数 segmentCount,使用长度为 4 的数组记录每个片段对应的整数,初始时 start=0,segmentCount=0。对于每个片段,只有当前片段不含前导零且对应的整数在范围 [0,255] 中,才可能是有效 IP 地址,此时继续遍历后面的片段。具体做法如下。
如果 segmentCount=4,则只有当字符串 s 遍历结束时才能得到有效的 IP 地址。当 start=n 时,字符串 s 遍历结束,根据数组中的整数生成 IP 地址,添加到答案中。
如果 segmentCount<4,则当前片段对应的片段编号为 segmentCount。用 end 表示当前片段的结束下标,用 s[start:end] 表示字符串 s 的下标范围 [start,end] 的子数组,将 end 从 start 到 n−1 依次遍历,执行如下操作。
如果 s[start:end] 不含前导零且对应的整数在范围 [0,255] 中,则当前片段可能是有效 IP 地址的一个片段,将当前片段对应的整数填入数组的下标 segmentCount 处,继续对下一个片段回溯,下一个片段的起始下标是 end+1,下一个片段的片段数是 segmentCount+1。
如果 s[start:end] 含前导零或对应的整数不在范围 [0,255] 中,则当前片段不可能是有效 IP 地址的一个片段,如果继续将 end 向右移动则当前片段一定不符合有效 IP 地址的规则,因此结束对当前 start 的回溯。
回溯结束时,即可得到所有可能的有效 IP 地址。
实现方面,由于有效 IP 地址的每个片段的长度都在范围 [1,3] 中,因此有效 IP 地址的数字位数(不包括点)应该在范围 [4,12] 中。如果 s 的长度小于 4 或大于 12,则一定不存在有效 IP 地址,返回空列表。只有当 s 的长度在范围 [4,12] 中时才需要使用回溯得到所有可能的有效 IP 地址。
参考storm大神
`
class Solution {
static final int SEGMENTS = 4;
List
int[] ipArr = new int[SEGMENTS];
int n;
String s;
public List
this.n = s.length();
this.s = s;
if (n < SEGMENTS || n > 3 * SEGMENTS) {
return ipAddresses;
}
backtrack(0, 0);
return ipAddresses;
}
public void backtrack(int start, int segmentCount) {
if (segmentCount == SEGMENTS) {
if (start == n) {
ipAddresses.add(convert(ipArr));
}
} else {
boolean flag = true;
for (int end = start; end < n && flag; end++) {
if (valid(start, end)) {
ipArr[segmentCount] = Integer.parseInt(s.substring(start, end + 1));
backtrack(end + 1, segmentCount + 1);
} else {
flag = false;
}
}
}
}
public boolean valid(int start, int end) {
int length = end - start + 1;
if (length < 1 || length > 3) {
return false;
}
if (length > 1 && s.charAt(start) == '0') {
return false;
}
return Integer.parseInt(s.substring(start, end + 1)) <= 255;
}
public String convert(int[] ipArr) {
StringBuffer sb = new StringBuffer();
sb.append(ipArr[0]);
for (int i = 1; i < SEGMENTS; i++) {
sb.append('.');
sb.append(ipArr[i]);
}
return sb.toString();
}
}
`
浙公网安备 33010602011771号