Problem
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)Code
bool isValiByte(const string& s) { int ip = 100*(s[0] - '0') + 10*(s[1] - '0') + (s[2] - '0'); return (ip < 256); } void rsip_r(const string& s,int i,int n,int pos, vector<string>& out,vector<string>& result) { if(i >= n){ return; } if(pos == 3 && i < n - 3){ return; } if(pos == 3){ if(n - i > 1 && s[i] == '0') return; string ip0 = s.substr(i,n - i); if(ip0.size() == 3 && isValiByte(ip0)) out[pos] = ip0; else if(ip0.size() < 3) out[pos] = ip0; else return; string tmp = out[0]; for(int j = 1;j < 4;++j){ tmp += "." + out[j]; } result.push_back(tmp); return; } string ip1 = s.substr(i,1); out[pos] = ip1; rsip_r(s,i+1,n,pos + 1,out,result); if(i < n - 1 && s[i] != '0'){ string ip2 = s.substr(i,2); out[pos] = ip2; rsip_r(s,i+2,n,pos + 1,out,result); } if(i < n - 2 && s[i] != '0'){ string ip3 = s.substr(i,3); if(isValiByte(ip3)){ out[pos] = ip3; rsip_r(s,i+3,n,pos + 1,out,result); } } } vector<string> restoreIpAddresses(string s) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. vector<string> out(4); vector<string> result; int n = s.size(); rsip_r(s,0,n,0,out,result); return result; }
No comments:
Post a Comment