restore ip address

题目

题意:把一个数字串用小数点分隔成4段,问共能形成多少个合法的IP地址。

分析:

这是一个简单的搜索问题。需要注意的是如下边界条件

  • 每一段的数字必须在0-255之间
  • 数字不能有前导0

代码:

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
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
// 看起来像是简单的搜索问题。一个IP地址的一段只能是0-255,因此长度最多为3
// 中间可以进行剪枝
// 不知道有没有什么奇怪的边界情况
// 果然是有的,比如不应该有前导0
// 以及是否需要去重?
// 事实说明不需要。
vector<string> ans;
int len[4], byte[4];

// 因为模板的原因,必须cast成int?
for (len[0] = 1; len[0] <= min(3, (int) s.length()); len[0]++) {
byte[0] = stoi(s.substr(0, len[0]));
if (byte[0] > 255)
continue;
// 考虑前导0问题
if (len[0] > 1 && s[0] == '0')
continue;

for (len[1] = 1; len[1] <= min(3, (int) s.length() - len[0]); len[1]++) {
byte[1] = stoi(s.substr(len[0], len[1]));
if (byte[1] > 255)
continue;
if (len[1] > 1 && s[len[0]] == '0')
continue;

for (len[2] = 1; len[2] <= min(3, (int) s.length() - len[0] - len[1]); len[2]++) {
byte[2] = stoi(s.substr(len[0] + len[1], len[2]));
if (byte[2] > 255)
continue;
if (len[2] > 1 && s[len[0]+len[1]] == '0')
continue;

len[3] = s.length() - len[0] - len[1] - len[2];
// 除了要考虑位数不够的情况,也要考虑位数太多的情况,这也是不合法的
if (len[3] <= 0 || len[3] > 3)
continue;
byte[3] = stoi(s.substr(len[0] + len[1] + len[2], len[3]));
if (byte[3] > 255)
continue;
if (len[3] > 1 && s[len[0]+len[1]+len[2]] == '0')
continue;

string ip = s.substr(0, len[0]) + "." + s.substr(len[0], len[1]) + "." +
s.substr(len[0] + len[1], len[2]) + "." + s.substr(len[0] + len[1] + len[2], len[3]);
ans.push_back(ip);
// cout << ip << endl;
}
}
}

return ans;
}
};

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 yxhlfx@163.com

文章标题:restore ip address

本文作者:红尘追风

发布时间:2015-05-01, 18:13:46

原始链接:http://www.micernel.com/2015/05/01/restore_ip_address/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录