lintcode--恢复ip地址

题目描述:
给一个由数字组成的字符串。求出其可能恢复为的所有IP地址。

样例:
给出字符串 “25525511135”,所有可能的IP地址为:

[
“255.255.11.135”,
“255.255.111.35”
]
(顺序无关紧要)

思路讲解:
首先我们说一下ip地址的范围:0.0.0.0—-255.255.255.255,所以我们需要将这个字符串分为四段,而且每一段都要在0-255之间,故我们每一次都是取字符串的位数是1-3,我的思路是取三次,然后字符串剩下的作为第四次,但是这里我们需要注意两个点就是,ip地址中不存在010这样的,即如果首字符是0,那么其后面不能再跟其他的了,第二个就是我们需要判断,是否能取不到我们想要的长度的子字符串,基本上就是这样的问题吧,这里我们可以使用循环三次的方法,也可以使用深度搜索,这里我用的是深度搜索(递归)。

代码详解:

class Solution {
public:
    /*
     * @param s: the IP string
     * @return: All possible valid IP addresses
     */
    vector<string> restoreIpAddresses(string &s) {
        // write your code here
        vector<string>res;
        string cur="";

        restore(s,0,0,res,cur);

        //printstring(res);
        return res;
    }
    void restore(string s,int index,int count,vector<string>&res,string cur)
    {
        if(count==3){//ip地址有四段,故我们判断其已经有了三段,那么我们就将剩下的最为第四段
            int leave_len=s.length()-index;
            if(leave_len>0){
                string str=s.substr(index,leave_len);
                if(str[0]=='0'&&str.length()>1){//如果子字符串首字母是0,那么他就只能是0,后面不能添加任何数字了
                    return;
                }else{
                    int tmp=atoi(str.c_str());
                    if(tmp<=255&&tmp>=0){
                        res.push_back(cur+str);
                        return;
                    }
                }
            }
        }
        for(int i=1;i<=3;i++){//由于最多是ip(0-255)每一个最多是三位数
            int leave_len=s.length()-index;
            if(i<leave_len){//判断剩余的长度是否满足需要截取的长度
                string str=s.substr(index,i);
                int tmp=atoi(str.c_str());

                if(str[0]=='0'&&str.length()>1){
                    return;
                }else{
                    if(tmp<=255&&tmp>=0){
                        str=str+".";
                        restore(s,index+i,count+1,res,cur+str);
                    }
                }
            }
        }
    }
    void printstring(vector<string>res)
    {
        for(int i=0;i<res.size();i++){
            cout<<res[i]<<" ";
        }
        cout<<endl;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值