Restore IP Addresses [Leetcode 解题报告]

来源:互联网 发布:cmd登录mysql数据库 编辑:程序博客网 时间:2024/04/29 13:37

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)

用归并做的,一次把当前串分成两个,继续递归,最后合并。代码如下:

bool valid(string s){        int n=s.length(),temp=0;        if(n>3)return false;        if(n>1&&s[0]=='0')return false;        for(int i=0;i<n;i++){            temp=temp*10+s[i]-'0';        }        if(n==3&&temp>255)return false;        return true;    }    vector<string> make(string s,int k){        vector<string> result;        string temp="";        if(k==1){            if(!valid(s))return result;            result.push_back(s);            return result;        }        else{            int n=s.length();            for(int i=0;i<n-1;i++){                if(i>3*k/2-1||n-1-i>3*k/2)continue;                vector<string> left=make(s.substr(0,i+1),k/2);                vector<string> right=make(s.substr(i+1,n-i-1),k/2);                if(left.size()==0||right.size()==0)continue;;                for(int j=0;j<left.size();j++){                    for(int k=0;k<right.size();k++){                        temp=left[j]+"."+right[k];                        result.push_back(temp);                    }                }            }            return result;        }    }    vector<string> restoreIpAddresses(string s) {        return make(s,4);    }

还有一种方法就是DFS,leetcode上的结果要比上面的归并(4ms)好一些(0ms),代码如下:

 bool valid(string s){        int n=s.length();        if(n>3)return false;        if(s[0]=='0'&&n>1)return false;        int temp=0;        for(int i=0;i<n;i++){            temp=temp*10+s[i]-'0';        }        if(temp>255)return false;        return true;    }    void dfs(vector<string> &result,vector<string> &temp,string s,int k){        int len=s.length();        if(k==3){            if(valid(s)){                temp[k]=s;                string res=temp[0]+"."+temp[1]+"."+temp[2]+"."+temp[3];                result.push_back(res);            }        }        else{            for(int i=0;i<3&&i<len+k-3;i++){                if(valid(s.substr(0,i+1))&&(len-i-1)>=(3-k)&&(len-1-i)<=3*(3-k)){                    temp[k]=s.substr(0,i+1);                    dfs(result,temp,s.substr(i+1,len-i-1),k+1);                }               }                    }    }    vector<string> restoreIpAddresses(string s) {        vector<string> result;        vector<string> temp(4,"111");        dfs(result,temp,s,0);        return result;    }
1 0
原创粉丝点击