1 class Solution {
2 public:
3 bool isValid(string &s, int start, int end){
4 int len = end-start+1;
5 if (len<=0 || len>3)
6 return false;
7 if (len>1 && s.at(start)=='0')
8 return false;
9 int _val = atoi(s.substr(start,len).c_str());
10 if (_val>=0 && _val<=255)
11 return true;
12 return false;
13 }
14 vector<string> restoreTwo(string & s, int start, int end){
15 int len = end-start+1;
16 vector<string> rlt;
17 if (len<=0 || len>6)
18 return rlt;
19 vector <string> rlts;
20 for (int i=start;i<end; i++){
21 if (isValid(s,start, i)&& isValid(s,i+1,end))
22 rlts.push_back(s.substr(start, i-start+1)+"."+s.substr(i+1, end-i));
23 }
24 return rlts;
25 }
26 vector<string> restoreIpAddresses(string s) {
27 // IMPORTANT: Please reset any member data you declared, as
28 // the same Solution instance will be reused for each test case.
29 int len = s.length();
30 vector<string> rlts;
31 for (int i=0; i<len-1; i++){
32 if (i+1<2 || len-i-1<2 || i+1>6 || len-i-1>6)
33 continue;
34 vector<string> left = restoreTwo(s,0,i);
35 vector<string> right = restoreTwo(s,i+1,len-1);
36 int m = left.size();
37 int n = right.size();
38 if (m<=0 || n<=0)
39 continue;
40 for (int p=0; p<m; p++)
41 for (int q=0; q<n; q++){
42 rlts.push_back(left[p]+"."+right[q]);
43 //cout << "[" << left[p]+"."+right[q] << "]" << endl;
44 }
45 }
46 return rlts;
47 }
48 };