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)
vector<string> restoreIpAddresses(string s)
{
vector<string> result;
if(s.size() < 4 || s.size() > 12)
return result;
if((s.size() == 12 && s[0] > '2'))
return result;
string value;
restoreIpAddressCore(s, 0, 0, result, value);
return result;
}
void restoreIpAddressCore(string s, int index, int number, vector<string> &result, string& value)
{
if(index == (int)s.size() && number == 4)
{
result.push_back(value);
return;
}
if((int)s.size() - index > 3 * (4 - number) || (int)s.size() - index < (4 - number))
return;
int tempNumber = 0;
for(int i = 0; i < 3; i++)
{
tempNumber = 10 * tempNumber + s[i + index] - '0';
if(tempNumber >= 0 && tempNumber <= 255)
{
for(int j = 0; j <= i; j++)
value.push_back(s[index+j]);
if(number < 3)
value.push_back('.');
restoreIpAddressCore(s, index + i + 1, number + 1, result, value);
if(number < 3)
value.pop_back();
for(int j = 0; j <= i; j++)
value.pop_back();
if(tempNumber == 0)
break;
}
}
}