Restore IP Addresses

【题目】

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值