Monday, November 25, 2013

LeetCode Problem : Restore IP Addresses

Problem


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)

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