为什么80%的码农都做不了架构师?>>>   

问题:

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)

解决:http://www.cnblogs.com/grandyang/p/4305572.html

【经验】一是只要遇到字符串的子序列或配准问题首先考虑动态规划DP,二是只要遇到需要求出所有可能情况首先考虑用递归

① 这道题并非是求字符串的子序列或配准问题,更符合第二种情况,所以我们要用递归来解。我们用k来表示当前还需要分的段数,如果k = 0,则表示三个点已经加入完成,四段已经形成,若这时字符串刚好为空,则将当前分好的结果保存。若k != 0, 则对于每一段,我们分别用一位,两位,三位来尝试,分别判断其合不合法,如果合法,则调用递归继续分剩下的字符串,最终求出所有合法组合。

class Solution { //5ms
    public List<String> restoreIpAddresses(String s) {
        List<String> res = new ArrayList<>();
        dfs(s,0,"",res);
        return res;
    }
    public void dfs(String s,int i,String out,List<String> res){
        if(i == 4){
            if(s.isEmpty()) res.add(out);
            return;
        }
        for(int k = 1;k <= 3;k ++){
            if(s.length() < k) break;
            int val = Integer.parseInt(s.substring(0,k));
            if(val > 255 || k != String.valueOf(val).length()) continue;
            dfs(s.substring(k),i + 1,out + s.substring(0,k) + (i == 3 ? "" : "."),res);
        }
    }
}

② 在discuss中看到的,使用递归的方法。

class Solution {//2ms
    public List<String> restoreIpAddresses(String s) {
        List<String> res = new ArrayList<String>();
        if (s.length() > 12 || s.length() < 4){
            return res;
        }
        dfs(s,0,4,"",res);
        return res;
    }
    public void dfs(String s,int i,int k,String out,List<String> res){
        if(s.length() - i > 3 * k || s.length() - i < k){
            return;
        } 
        if(k == 0){
            res.add(new String(out));
            return;
        }
        int num = 0;
        int count = 0;
        for (int j = i;j < s.length() ;j ++ ) {
            char c = s.charAt(j);
            num = num * 10 + c - '0';
            count ++;
            out += c;
            if(num > 255 || (count > 1 && num < 10)){//不符合IP地址的定义
                break;
            }
            if(k > 1){
                dfs(s,j + 1,k - 1,out + '.',res);
            }else{
                dfs(s,j + 1,k - 1,out,res);
            }
        }
    }
}

③  这里IP的特性是最大数字不能超过255。比上个方法好的地方在于a+b+c+d= s.length()才会判断数字是否合法,避免了很多1+1+1+N这种不需要检查的情况。

class Solution { //4ms
    public List<String> restoreIpAddresses(String s) {
        List<String> res = new ArrayList<String>();
        int len = s.length();
        for (int i = 1; i <= 3;i ++){  //第一段
            if (len - i > 9) continue;            
            for (int j = i + 1; j <= i + 3;j ++){  //第二段
                if (len - j > 6) continue;                
                for (int k = j + 1; k <= j + 3 && k < len;k ++){  //第三段
                    int a,b,c,d;                // 将四段使用"."分割
                    a = Integer.parseInt(s.substring(0,i));  
                    b = Integer.parseInt(s.substring(i,j)); 
                    c = Integer.parseInt(s.substring(j,k));
                    d = Integer.parseInt(s.substring(k));
                    if (a > 255 || b > 255 || c > 255 || d > 255) continue; 
                    String ip = a + "." + b + "." + c + "." + d;
                    if (ip.length() < len + 3 ) continue; // 像“01”这样的要单独处理
                    res.add(ip);
                }
            }
        }
        return res;
    }
}

转载于:https://my.oschina.net/liyurong/blog/1539242

将给定的字符串划分为所有可能的IP地址 Restore IP Addresses相关推荐

  1. 计算机一级ip地址分类,IP地址分类和子网划分

    一.IP地址 1.IP地址概述 § 在一个IP网络中每一个设备的唯一标识符,有32位二进制数组成,这些位通常被分割成四组,每组包含一个字节(8位).然后转换成十进制表示,这叫点分十进制表示法. § 每 ...

  2. 【IP地址】IP地址与子网划分

    文章目录 1.IP地址 1.1 IPv4地址的组成 1.2 IP地址的分类 1.3 IP地址汇总 1.4 私有地址和共有地址 1.5 如何判断两个IP地址是否属于同一个网段 2.子网掩码 2.1 子网 ...

  3. 网络划分与寻址三要素: IP地址、子网掩码和地址分类

    正文 实际工作中用到网络知识的机会并不多,虽然以前学习过,但是许久不用自然也就生疏了.最近拿到几台云上的虚拟机,需要为它们建立一个VPC(虚拟私有云,就是一个虚拟的局域网),得益于虚拟化技术,作为用户 ...

  4. LeetCode 93. 复原 IP 地址【字符串,回溯算法】

    93. 复原 IP 地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔. 例如:"0.1.2.201" ...

  5. linux c socket ip地址 字符串 数字 转换 inet_addr inet_ntoa

    目录 0.转换函数 1.介绍inet_addr函数 2.介绍inet_ntoa函数 3.一般使用总结 inet_addr 将字符串形式的IP地址 -> 网络字节顺序  的整型值 inet_nto ...

  6. 面试题整理17 输入一个字符串判断一个字符串是否是有效ip地址

    题目:输入一个字符串判断字符串是否为有效ip地址,  ip地址的形式为XXX.XXX.XXX.XXX.对于XXX表示为0-256的数,但是如果第一位是0而且整数不为0则是非法的,如01 不允许使用 ...

  7. IP 地址编址方式(分类、子网划分、无分类)

    1. 分类 由两部分组成,网络号和主机号,其中不同分类具有不同的网络号长度,并且是固定的. IP 地址 ::= {< 网络号 >, < 主机号 >} 2. 子网划分 通过在主机 ...

  8. 【超清视频】CCNA系列课程之二:IP地址介绍及VLSM子网划分

    本节视频主要介绍了为什么需要IP地址,IP地址在网络中的作用,IPV4包头的格式.二进制和十进制之间的转换方法,IP地址的分类范围,什么是私有IP地址.如何进行等长子网掩码划分和VLSM可变长子网掩码 ...

  9. 王道考研 计算机网络17 IP数据报 最大传送单元MTU IP地址 IPv4 子网划分 ARP协议 ICMP协议 移动IP

    TCP/IP协议栈 TCP:传输控制协议(Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议. IP是Internet Protocol( ...

  10. 计算机网络ip地址划分方法,ip地址怎么划分 ip地址划分方法【图文】

    IP地址指的是互联网的协议地址,它的全称为IP Address,IP地址是IP协议当中的一种地址格式,互联网上的任意一个网络以及它们的主机使用的逻辑地址都是由IP地址分配的,那么你知道IP地址是怎样进 ...

最新文章

  1. ANSYS滑块导轨配合方法
  2. BGP属性分析--Weight
  3. setjmp与logjmp用法总结
  4. 用信号量锁定:一个例子
  5. Larbin源代码分析[6]LARBIN中线程处理类
  6. 拉取网页_用命令行管理你的 GitHub 项目,不必再开网页,官方 CLI 工具 1.0 版上线...
  7. 魔力宝贝服务器修改技能经验,传说中的技能及修改建议
  8. 安卓旅途之——开发数独(一)
  9. 程序员拯救乐坛?OpenAI 用“逆天”GPT2.0 搞了个 AI 音乐生成器
  10. 史上最全使用Nexus搭建Maven服务器详细配置
  11. 物联网工程毕业设计简介
  12. 机器学习笔记 - 什么是先验算法(Apriori Algorithm)?
  13. Navicat Premium15 注册出现No all pattern found! file already patched?
  14. 如何成为优秀的网络安全工程师(转载)
  15. 接口优化从20s优化到500ms
  16. win10家庭组(win10家庭组共享打印机)
  17. Pr入门学习之选择GPU加速
  18. VCF | 多等位基因位点如何拆分?InDel变异如何标准化?
  19. 开发神技能 | Python Mock 的入门
  20. SpringBoot+mybatis+postgreSQL+thymeleaf增删改查

热门文章

  1. 【割点】【割边】tarjan
  2. HDU 5908 Abelian Period 可以直接用multiset
  3. The Child and Toy
  4. [转]WiX v3.7——支持MSBuild、自更新及引用计数
  5. 求职与简历功能上线测试
  6. 产品特点概述-驰骋工作流
  7. PackageManager.getPackageSizeInfo||UserHandle.myUserId()
  8. 可以掉落和滑动的星星
  9. java static 执行顺序
  10. php’s explode() 函数