Restore IP Addresses
2016-05-14 08:42
295 查看
【题目】
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
For example:
Given
return
【题意】
给一个字符串,求出可能组成有效ip地址的所有组合。例如:给25525511135,要求返回可能的IP:255.255.11.135,255.255.111.35。
【分析】
ipv4是由四位段组成,每段范围是0到255,满足了一共有4位,并且每一位都合法的话,那么这个字符串便是满足题意的字符串,可以加入结果集。
用回溯法解这道题。回溯算法也叫试探法,它是一种系统地搜索问题的解的方法,经典的八皇后问题就可以用回溯法。它的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。这和人走迷宫的思路类似。回溯法是一个通用的解题法,比如需要求一个最优解,没有一个直接的方式可以得到结论,但是我们可以试探性的尝试每一条路,这样所有解都出来了。
例如有11111,那么按照人的思维也是先尝试1.1.1.11,再试试11.1.1.1也可以,尝试111.1.1.x的时候发现数字不够用了,就说明这个尝试失败了。
解题程序从IP地址的第一段开始不断地取1~3位字符尝试,如果合法就继续递归尝试IP地址的第二段,直到第四段,遇到可行的解就记录下来,如果不合法或者到了第四段发现不可能是正确的IP就退出。
实现:
回溯思想:
1、定义一个解空间,它包含问题的解。
2、利用适于搜索的方法组织解空间。
3、利用深度优先法搜索解空间。
4、利用限界函数避免移动到不可能产生解的子空间。
问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。
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地址的所有组合。例如:给25525511135,要求返回可能的IP:255.255.11.135,255.255.111.35。
【分析】
ipv4是由四位段组成,每段范围是0到255,满足了一共有4位,并且每一位都合法的话,那么这个字符串便是满足题意的字符串,可以加入结果集。
用回溯法解这道题。回溯算法也叫试探法,它是一种系统地搜索问题的解的方法,经典的八皇后问题就可以用回溯法。它的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。这和人走迷宫的思路类似。回溯法是一个通用的解题法,比如需要求一个最优解,没有一个直接的方式可以得到结论,但是我们可以试探性的尝试每一条路,这样所有解都出来了。
例如有11111,那么按照人的思维也是先尝试1.1.1.11,再试试11.1.1.1也可以,尝试111.1.1.x的时候发现数字不够用了,就说明这个尝试失败了。
解题程序从IP地址的第一段开始不断地取1~3位字符尝试,如果合法就继续递归尝试IP地址的第二段,直到第四段,遇到可行的解就记录下来,如果不合法或者到了第四段发现不可能是正确的IP就退出。
实现:
public class leetcode { ArrayList<String> res = new ArrayList<String>(); public List<String> restoreIpAddresses(String s) { backTracking(s, 0, ""); return res; } //w表示为处理的字符串,m表示已经加入地址的字符串 //d表示目前识别的是ip的第几段,从0到3 public void backTracking(String w, int d, String m) { //位数不符,直接pass int len = w.length(); if (len < 4 - d || len > 3 * (4 - d)) return; //识别到最后一段时,如果符合,添加到结果集 if (d == 3) { if (w.length() > 1 && w.charAt(0) == '0') return; //防止“010”这种情况 int last = Integer.valueOf(w); if (last >= 0 && last <= 255) { m += w; res.add(m); } } //识别ip的前三段,每段可能是1位、2位、3位 for (int i = 1; i < 4 && i < w.length(); i++) { String str = w.substring(0, i); if (str.length() > 1 && str.charAt(0) == '0') return; //防止“010”这种情况 int t = Integer.valueOf(str); if (t >= 0 && t <= 255) { String next = m + str + "."; backTracking(w.substring(i), d + 1, next); } } } }
回溯思想:
1、定义一个解空间,它包含问题的解。
2、利用适于搜索的方法组织解空间。
3、利用深度优先法搜索解空间。
4、利用限界函数避免移动到不可能产生解的子空间。
问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。
相关文章推荐
- 第4章 序言的具体写法
- 【华为OJ】【059-201301-JAVA-题目2-3级】
- 使用MySQL制作SNP146数据库
- setTimeout
- jvm大对象
- perl 面向对象 use base
- perl 面向对象 use base
- 小王子读后感。。偶然写的
- 如何查看SE16N修改的表的记录
- Markdownpad2 文本编辑工具的破解方法
- 使用scanf函数时有时会把回车也读入,最终让回车传入缓冲区
- 释放Ubuntu/Linux系统cache,增加可用内存空间
- Liferay获取用户的IP地址
- 【华为OJ】【058-合法IP】
- Mysql常用语法
- Linux进程地址管理之mm_struct
- 值类型和引用类型的区别
- SD模块Bapi
- Http请求状态码
- 构造函数初始化时必须采用初始化列表