restore ip addresses

Problem

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

1
2
3
4
For example:
Given "25525511135",

return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)

分析

这道题目其实并不难,主要是要知道IP地址的特性就好了。IP地址分为四个部分,每个部分以‘.’隔开且每个部分的值不能大于255。其余的就是backtracking就好了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class  {
public List<String> restoreIpAddresses(String s) {
List<String> ret = new LinkedList<>();
if (s == null || s.length() < 4) return ret;
StringBuilder sb = new StringBuilder();
helper(s, ret, sb, 0, 0);
return ret;
}

private void helper(String s, List<String> ret, StringBuilder sb, int part, int start) {
int length = sb.length();
if (part == 3) {
int size = s.substring(start).length();
if (size == 1 ||(size > 1 && size < 4 && s.charAt(start) != '0' && Integer.valueOf(s.substring(start)) <= 255)) {
sb.append(s.substring(start));
ret.add(sb.toString());
sb.setLength(length);
}

return;
}
for (int i = start + 1; i < Math.min(start + 4, s.length()); i++) {
String now = s.substring(start, i);
if (now.length() == 1 || (now.charAt(0) != '0' && Integer.valueOf(now) <= 255)) {
sb.append(now).append(".");
helper(s, ret, sb, part + 1, i);
sb.setLength(length);
}
}
}
}