随笔- 509  文章- 0  评论- 151  阅读- 22万 

Restore IP Addresses

2013.12.31 18:06

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)

Solution:

  Given a number string, find all of the possible IP address that it may represent in decimal form.

  Finding all possible answer means we usually have to do a search, either DFS or BFS. This problem can be properly solved with DFS.

  Time complexity is O(2^n), space compelxity is O(2^n) as well, where n is the length of the string.  Luckily the actual compelxity is much lower than 2^n, as each token in the ip address ranges in [0, 255], this natural limit helps us trim a lot of invalid search paths. By the way, the length n can be at most 12 (255.255.255.255), since the ip here only refers to IPv4, not including IPv6.

Accepted code:

复制代码
 1 //#define __MAIN__
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <string>
 6 #include <vector>
 7 using namespace std;
 8 
 9 class Solution {
10 public:
11     vector<string> restoreIpAddresses(string s) {
12         // Note: The Solution object is instantiated only once and is reused by each test case.
13         str = s.data();
14         slen = strlen(str);
15         res.clear();
16         if(slen > 12){
17             return res;
18         }
19         dfs(0, 0);
20         
21         return res;
22     }
23 private:
24     int slen;
25     int a[4];
26     vector<string> res;
27     const char *str;
28     char tmp[100];
29 
30     void dfs(int si, int ai) {
31         int i;
32         int num;
33         string snum;
34         
35         if(ai == 4){
36             if(si == slen){
37                 sprintf(tmp, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
38                 res.push_back(string(tmp));
39             }
40             return;
41         }
42         
43         if(si >= slen){
44             return;
45         }
46         
47         if(ai + (slen - si) / 3 > 4){
48             return;
49         }
50         
51         num = 0;
52         snum = "";
53         for(i = si; i < si + 3 && i < slen; ++i){
54             if(snum.length() > 0 && snum[0] == '0'){
55                 //cannot add more digits after leading 0
56                 break;
57             }
58             num = num * 10 + (str[i] - '0');
59             snum = snum + str[i];
60             if(num > 255){
61                 break;
62             }else{
63                 a[ai] = num;
64                 dfs(i + 1, ai + 1);
65             }
66         }
67     }
68 };
69 
70 #ifdef __MAIN__
71 #include <iostream>
72 int main()
73 {
74     Solution sol;
75     char str[100];
76     vector<string> res;
77     int i;
78 
79     while(gets(str) != NULL){
80         res = sol.restoreIpAddresses(string(str));
81         cout << "res_count = " << res.size() << endl;
82         for(i = 0; i < res.size(); ++i){
83             cout << res[i] << endl;
84         }
85         cout << endl;
86     }
87 
88     return 0;
89 }
90 #endif
复制代码

 

 posted on   zhuli19901106  阅读(540)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示