绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
Restore IP Addresses
2015-03-28 00:00:00

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)

解题思路:

注意到ip地址分成四部分,每部分0<=ip<=25,字符串的表示中,还不能是010这种形式。有两种办法,种枚举法,枚举每一部分的IP形式,代码如下:

class Solution {
public:
    vector<string> restoreIpAddresses(string s) {
        int len = s.length();
        vector<string> result;
        if(len>12 || len < 4){
            return result;      //不满足的情况
        }
        //枚举法,多C(n-1, 3)中情况
        for(int i1=1; i1 < 4 && i1 <= len - 3; i1++){
            string ip1 = s.substr(0, i1);
            if(checkIP(ip1)){
                for(int i2 = i1 + 1; i2 < i1 + 4 && i2 <= len - 2; i2++){
                    string ip2 = s.substr(i1, i2 - i1);
                    if(checkIP(ip2)){
                        for(int i3 = i2 + 1; i3 < i2 + 4 && i3 <= len - 1; i3++){
                            string ip3 = s.substr(i2, i3 - i2);
                            if(checkIP(ip3)){
                                string ip4 = s.substr(i3);
                                if(checkIP(ip4)){
                                    result.push_back(ip1 + "." + ip2 + "." + ip3 + "." + ip4);
                                }
                            }
                        }
                    }
                }
            }
        }
        
        return result;
    }
private:
    bool checkIP(string s){
        int len = s.length();
        if(len > 3 || len == 0){
            return false;
        }
        //高位不能为0
        if(s[0] == '0' && len>1){
            return false;
        }
        //不能超过255
        int iNumber = 0;
        int base = 1;
        for(int i=len-1; i>=0; i--){
            iNumber += base * (s[i] - '0');
            base *= 10;
        }
        if(iNumber>255){
            return false;
        }
        return true;
    }
};

这里注意一个问题,每个地方都枚举太麻烦了,倘若有100个ip块,岂不是要手动验证100次?太麻烦了!可以想到回溯法,通过递归进行回溯,具体要解析多少个ip块,通过参数指定。代码如下:

class Solution {
public:
    vector<string> restoreIpAddresses(string s) {
        int len = s.length();
        vector<string> result;
        if(len>12 || len < 4){
            return result;      //不满足的情况
        }
        partIP(result, 0, 4, "", s);
        
        return result;
    }
private:
    void partIP(vector<string>& result, int startIndex, int leftNumber, string tempResult, string& s){
        int len = s.length();
        if(leftNumber <= 0){
            return;
        }
        if(len - startIndex < leftNumber){
            return;
        }
        for(int i=startIndex + 1; i< startIndex + 4 && i <= len ; i++){
            string ip = s.substr(startIndex, i - startIndex);
            if(checkIP(ip)){
                if(leftNumber == 1 && i == len){
                    result.push_back(tempResult + ip);
                }else{
                    partIP(result, i, leftNumber - 1, tempResult + ip + ".", s);
                }
            }else{
                break;
            }
        }
    }
    bool checkIP(string s){
        int len = s.length();
        if(len > 3 || len == 0){
            return false;
        }
        //高位不能为0
        if(s[0] == '0' && len>1){
            return false;
        }
        //不能超过255
        int iNumber = 0;
        int base = 1;
        for(int i=len-1; i>=0; i--){
            iNumber += base * (s[i] - '0');
            base *= 10;
        }
        if(iNumber>255){
            return false;
        }
        return true;
    }
};


转载请注明:康瑞部落 » Restore IP Addresses
分享好友

分享这个小栈给你的朋友们,一起进步吧。

康瑞部落
创建时间:2020-05-21 17:48:23
本小栈的内容主要包括以下几个方面: 1、有关计算机项目开发的个人心得 2、有关算法与数据结构方面的研究 3、其他计算机相关知识 4、读书笔记与书摘 5、个人兴趣的交流 6、生活琐事的记录 7、转载的美文
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • Ruiyuan Li
    栈主

小栈成员

查看更多
  • 栈栈
  • 一号管理员
  • gaokeke123
  • chengxuwei
戳我,来吐槽~