Restore IP Addresses:
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)
#define pb push_back
#define pp pop_back
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<string> ret;
string cur;
solve(s,0,1,cur,ret);
return ret;
}
void solve(string& s,int i,int kth,string& cur,vector<string>& ret)
{
int len=s.length();
if ( i>=len || kth>4 )
{
if ( i==len && kth==5)
ret.pb(cur);
return;
}
cur.pb(s[i]);
if (kth <4 )
cur.pb('.');
solve(s,i+1,kth+1,cur,ret);
if (kth<4 )
cur.pp();
cur.pp();
if ( s[i]=='0' )
return;
//two digits
if ( i<len-1 )
{
cur.pb(s[i]);
cur.pb(s[i+1]);
if (kth<4)
cur.pb('.');
solve(s,i+2,kth+1,cur,ret);
if ( kth<4)
cur.pp();
cur.pp();
cur.pp();
}
if (i <len-2)
{
int num= (s[i]-'0')*100+(s[i+1]-'0')*10+(s[i+2]-'0');
if ( num>255 )
return;
cur.pb(s[i]);
cur.pb(s[i+1]);
cur.pb(s[i+2]);
if ( kth<4 )
cur.pb('.');
solve(s,i+3,kth+1,cur,ret);
if ( kth<4 )
cur.pp();
cur.pp();
cur.pp();
cur.pp();
}
}
};