将给定的字符串划分为所有可能的IP地址 Restore IP Addresses
为什么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相关推荐
- 计算机一级ip地址分类,IP地址分类和子网划分
一.IP地址 1.IP地址概述 § 在一个IP网络中每一个设备的唯一标识符,有32位二进制数组成,这些位通常被分割成四组,每组包含一个字节(8位).然后转换成十进制表示,这叫点分十进制表示法. § 每 ...
- 【IP地址】IP地址与子网划分
文章目录 1.IP地址 1.1 IPv4地址的组成 1.2 IP地址的分类 1.3 IP地址汇总 1.4 私有地址和共有地址 1.5 如何判断两个IP地址是否属于同一个网段 2.子网掩码 2.1 子网 ...
- 网络划分与寻址三要素: IP地址、子网掩码和地址分类
正文 实际工作中用到网络知识的机会并不多,虽然以前学习过,但是许久不用自然也就生疏了.最近拿到几台云上的虚拟机,需要为它们建立一个VPC(虚拟私有云,就是一个虚拟的局域网),得益于虚拟化技术,作为用户 ...
- LeetCode 93. 复原 IP 地址【字符串,回溯算法】
93. 复原 IP 地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔. 例如:"0.1.2.201" ...
- linux c socket ip地址 字符串 数字 转换 inet_addr inet_ntoa
目录 0.转换函数 1.介绍inet_addr函数 2.介绍inet_ntoa函数 3.一般使用总结 inet_addr 将字符串形式的IP地址 -> 网络字节顺序 的整型值 inet_nto ...
- 面试题整理17 输入一个字符串判断一个字符串是否是有效ip地址
题目:输入一个字符串判断字符串是否为有效ip地址, ip地址的形式为XXX.XXX.XXX.XXX.对于XXX表示为0-256的数,但是如果第一位是0而且整数不为0则是非法的,如01 不允许使用 ...
- IP 地址编址方式(分类、子网划分、无分类)
1. 分类 由两部分组成,网络号和主机号,其中不同分类具有不同的网络号长度,并且是固定的. IP 地址 ::= {< 网络号 >, < 主机号 >} 2. 子网划分 通过在主机 ...
- 【超清视频】CCNA系列课程之二:IP地址介绍及VLSM子网划分
本节视频主要介绍了为什么需要IP地址,IP地址在网络中的作用,IPV4包头的格式.二进制和十进制之间的转换方法,IP地址的分类范围,什么是私有IP地址.如何进行等长子网掩码划分和VLSM可变长子网掩码 ...
- 王道考研 计算机网络17 IP数据报 最大传送单元MTU IP地址 IPv4 子网划分 ARP协议 ICMP协议 移动IP
TCP/IP协议栈 TCP:传输控制协议(Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议. IP是Internet Protocol( ...
- 计算机网络ip地址划分方法,ip地址怎么划分 ip地址划分方法【图文】
IP地址指的是互联网的协议地址,它的全称为IP Address,IP地址是IP协议当中的一种地址格式,互联网上的任意一个网络以及它们的主机使用的逻辑地址都是由IP地址分配的,那么你知道IP地址是怎样进 ...
最新文章
- ANSYS滑块导轨配合方法
- BGP属性分析--Weight
- setjmp与logjmp用法总结
- 用信号量锁定:一个例子
- Larbin源代码分析[6]LARBIN中线程处理类
- 拉取网页_用命令行管理你的 GitHub 项目,不必再开网页,官方 CLI 工具 1.0 版上线...
- 魔力宝贝服务器修改技能经验,传说中的技能及修改建议
- 安卓旅途之——开发数独(一)
- 程序员拯救乐坛?OpenAI 用“逆天”GPT2.0 搞了个 AI 音乐生成器
- 史上最全使用Nexus搭建Maven服务器详细配置
- 物联网工程毕业设计简介
- 机器学习笔记 - 什么是先验算法(Apriori Algorithm)?
- Navicat Premium15 注册出现No all pattern found! file already patched?
- 如何成为优秀的网络安全工程师(转载)
- 接口优化从20s优化到500ms
- win10家庭组(win10家庭组共享打印机)
- Pr入门学习之选择GPU加速
- VCF | 多等位基因位点如何拆分?InDel变异如何标准化?
- 开发神技能 | Python Mock 的入门
- SpringBoot+mybatis+postgreSQL+thymeleaf增删改查