93. 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)

第一种方法:
三重循环,遍历三个小数点的位置,对每个位置检查一下是否满足条件。

class Solution {
public:
    bool isvalid(string ip)
    {
        int value=atoi(ip.c_str());
        if(ip[0]=='0')
        {
            return ip.size()==1;
        }
        else
        {
            if(value<=255)
                return true;
            else
                return false;
        }
    }
    vector<string> restoreIpAddresses(string s) 
    {
        vector<string>ret;
        if(s.size()>12||s.size()<4)
            return ret;
        int i,j,k;
        string ip1,ip2,ip3,ip4;
        for(i=0;i<3&&i<s.size();i++)
            for(j=i+1;j<i+4&&j<s.size();j++)
                for(k=j+1;k<j+4&&k<s.size();k++)
                {
                    ip1=s.substr(0,i+1);
                    ip2=s.substr(i+1,j-i);
                    ip3=s.substr(j+1,k-j);
                    ip4=s.substr(k+1);
                    if(isvalid(ip1)&&isvalid(ip2)&&isvalid(ip3)&&isvalid(ip4))
                    {
                        string temp=ip1+'.'+ip2+'.'+ip3+'.'+ip4;
                        ret.push_back(temp);
                    }
                }
        return ret;
    }
};

第二种方法:回溯法,用一个count计数,满足条件则添加到结果中

class Solution {
public:
    void helper(string s,int count,vector<string>&ip_ret,vector<string> &temp) 
    {
        if(count==3)
        {
            if(s.size()==0||s.size()>3||(s.size()>1&&s[0]=='0'))
                return;
            int value=atoi(s.c_str());
            if(value>255)
                return;
            else
            {
                string ip;
                for(int j=0;j<3;j++)
                    ip.append(temp[j]).append(".");
                ip.append(s);
                ip_ret.push_back(ip);
            }
        }
        else
        {
            int i;
            for(i=1;i<4&&i<s.length();i++)
            {
                string ip_child=s.substr(0,i);
                if(i>1&&s[0]=='0')
                    break;
                int val=atoi(ip_child.c_str());
                if(val>=0&&val<=255)
                {
                    temp.push_back(ip_child);
                    helper(s.substr(i),count+1,ip_ret,temp);
                    temp.pop_back();
                }
            }
        }
    }
    vector<string> restoreIpAddresses(string s) 
    {
        vector<string>ip_ret;
        vector<string>temp;
        helper(s,0,ip_ret,temp);
        return ip_ret;
    }
};
class Solution {
public:
    void helper(string s,int start,int count,vector<string>&ip_ret,vector<string> &temp) 
    {
        if(count==4)
        {
            if(start==s.size())
            {
                string ip;
                for(int j=0;j<3;j++)
                    ip.append(temp[j]).append(".");
                ip.append(temp[3]);
                ip_ret.push_back(ip);
            }
            return;
        }
        else
        {
            for(int i=start;i<start+4&&i<s.length();i++)
            {
                if(i>start&&s[start]=='0')
                    break;
                string ip_child=s.substr(start,i-start+1);
                int val=atoi(ip_child.c_str());
                if(val>=0&&val<=255)
                {
                    temp.push_back(ip_child);
                    helper(s,i+1,count+1,ip_ret,temp);
                    temp.pop_back();
                }
            }
        }
    }
    vector<string> restoreIpAddresses(string s) 
    {
        vector<string>ip_ret;
        vector<string>temp;
        helper(s,0,0,ip_ret,temp);
        return ip_ret;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值