Restore IP Addresses

来源:互联网 发布:网络贷款诈骗方式 编辑:程序博客网 时间:2024/06/04 20:01

【题目】

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、利用限界函数避免移动到不可能产生解的子空间。

问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。



0 0
原创粉丝点击