您的位置:首页 > 其它

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
"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、利用限界函数避免移动到不可能产生解的子空间。
问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: