http://www.cnblogs.com/remlostime/archive/2012/11/14/2770072.html
1 class Solution { 2 private: 3 vector<string> ret; 4 int pos[4]; 5 public: 6 bool check(string &s, int beg, int end) 7 { 8 string ip(s, beg, end - beg + 1); 9 if (ip.size() == 1) 10 return "0" <= ip && ip <= "9"; 11 else if (ip.size() == 2) 12 return "10" <= ip && ip <= "99"; 13 else if (ip.size() == 3) 14 return "100" <= ip && ip <= "255"; 15 else 16 return false; 17 } 18 19 void dfs(int dep, int maxDep, string &s, int start) 20 { 21 if (dep == maxDep) 22 { 23 if (start == s.size()) 24 { 25 int beg = 0; 26 string addr; 27 for(int i = 0; i < maxDep; i++) 28 { 29 string ip(s, beg, pos[i] - beg + 1); 30 beg = pos[i] + 1; 31 addr += i == 0 ? ip : "." + ip; 32 } 33 ret.push_back(addr); 34 } 35 return; 36 } 37 38 for(int i = start; i < s.size(); i++) 39 if (check(s, start, i)) 40 { 41 pos[dep] = i; 42 dfs(dep + 1, maxDep, s, i + 1); 43 } 44 } 45 46 vector<string> restoreIpAddresses(string s) { 47 // Start typing your C/C++ solution below 48 // DO NOT write int main() function 49 ret.clear(); 50 dfs(0, 4, s, 0); 51 return ret; 52 } 53 };
http://yucoding.blogspot.com/2013/04/leetcode-question-83-restore-ip.html
Restore IP Addresses:
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
For example:
Given
Given
"25525511135"
,return
["255.255.11.135", "255.255.111.35"]
. (Order does not matter)Analysis:
This problem can be viewed as a DP problem. There needed 3 dots to divide the string, and make sure the IP address is valid: less than or equal to 255, greater or equal to 0, and note that, "0X" or "00X" is not valid.
For the DP, the length of each part is from 1 to 3. We use a vector<string> to store each part, and cut the string every time. Details see the code.
Note that "atoi" is for c-string, <string> need to convert to cstring by str.c_str();
Code(Updated 201309):
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
|
class Solution { public : bool valid(string s){ if (s.size()==3 && ( atoi (s.c_str())>255 || atoi (s.c_str())==0)){ return false ;} if (s.size()==3 && s[0]== '0' ){ return false ;} if (s.size()==2 && atoi (s.c_str())==0){ return false ;} if (s.size()==2 && s[0]== '0' ){ return false ;} return true ; } void getRes(string s, string r, vector<string> &res, int k){ if (k==0){ if (s.empty()){res.push_back(r);} return ; } else { for ( int i=1;i<=3;i++){ if (s.size()>=i && valid(s.substr(0,i))){ if (k==1){getRes(s.substr(i),r+s.substr(0,i),res,k-1);} else {getRes(s.substr(i),r+s.substr(0,i)+ "." ,res,k-1);} } } } } vector<string> restoreIpAddresses(string s) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<string> res; getRes(s, "" ,res,4); return res; } }; |
Code(old version):
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
|
class Solution { public : void dp(string s,vector<string> &cur ,vector<string> &res){ if (cur.size()==3){ // if there are 4 parts in the original string cur.push_back(s); //all 4 parts and check if valid bool r = true ; for ( int i=0;i<4;i++){ if ( atoi (cur[i].c_str())>255){ //check value r = false ; break ; } if ((cur[i].size()>1 && cur[i][0]== '0' )){ //check "0X" "00X" and "0XX" cases r = false ; break ; } } if (r){ res.push_back(cur[0]+ "." +cur[1]+ "." +cur[2]+ "." +cur[3]); } cur.pop_back(); } else { for ( int i=0;i<3;i++){ if (s.size()>i+1){ cur.push_back(s.substr(0,i+1)); dp(s.substr(i+1,(s.size()-i-1)),cur,res); cur.pop_back(); } } } } vector<string> restoreIpAddresses(string s) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<string> res,cur; if (s.size()>12 || s.size()<4 ){ return res;} dp(s,cur,res); // cur stores the current separation return res; } };
|