leetcode解题: Restore IP Address (93)

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

For example:
Given “25525511135”,

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

解法1: Backtracking, Time O(2^N), Space O(2^N)

也是比较经典的backtracking的题目,也是不停的去取一部分string,要判断不用继续搜索的条件有这些:

  1. 每个字串是否符合ip的条件,一定要是0到255, 并且开头的不能是0, 除了0本身。
  2. 字串的长度不能超过3
  3. ip一共有4部分组成,所以也要判断是否超i过了这个条件。

C++

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> res;
if (s.empty()) {
return res;
}
vector<string> cur;
helper(s, 0, cur, res);
return res;
}
bool isValid(string s) {
if (s[0] == '0' && s.size() > 1) {
return false;
}
int temp = stoll(s);
if (temp >= 0 && temp <= 255) {
return true;
} else {
return false;
}
}
string createIP(vector<string>& cur) {
string res = "";
for (int i = 0; i < cur.size() - 1; ++i) {
res += cur[i] + ".";
}
res += cur[cur.size() - 1];
return res;
}
void helper(string s, int pos, vector<string>& cur, vector<string>& res) {
if (pos == s.size()) {
if (cur.size() == 4) {
res.push_back(createIP(cur));
}
return;
}
if (cur.size() > 4) {
return;
}
for (int i = pos; i < s.size(); ++i) {
if (cur.size() < 4 && i - pos < 3) {
string item = s.substr(pos, i - pos + 1);
// check if the item is between 0 and 255
if (!isValid(item)) {
continue;
}
cur.push_back(item);
helper(s, i + 1, cur, res);
cur.pop_back();
}
}
}
};

Java

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class Solution {
public List<String> restoreIpAddresses(String s) {
List<String> res = new ArrayList<>();
if (s == null || s.length() == 0) {
return res;
}
List<String> current = new ArrayList<String>();
helper(s, 0, current, res);
return res;
}
boolean isValid(String s) {
if (s.charAt(0) == '0' && s.length() > 1) {
return false;
}
int temp = Integer.parseInt(s);
if (temp >= 0 && temp <= 255) {
return true;
}
return false;
}
String createIP(List<String> current) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < current.size() - 1; i++) {
sb.append(current.get(i));
sb.append(".");
}
sb.append(current.get(current.size() - 1));
return sb.toString();
}
private void helper(String s, int pos, List<String> current, List<String> res) {
if (pos == s.length()) {
if (current.size() == 4) {
res.add(createIP(current));
}
return;
}
if (current.size() > 4) return;
for (int i = pos; i < s.length() && i < pos + 3; i++) {
if (current.size() < 4) {
String item = s.substring(pos, i + 1);
if (!isValid(item)) {
continue;
}
current.add(item);
helper(s, i + 1, current, res);
current.remove(current.size() - 1);
}
}
}
}