LintCode:恢复IP地址【DFS】

描述

给一个由数字组成的字符串。求出其可能恢复为的所有IP地址。
(你的任务就是往这段字符串中添加三个点, 使它成为一个合法的IP地址. 返回所有可能的IP地址.)

样例:

输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
解释: ["255.255.111.35", "255.255.11.135"] 同样可以.

思路:

ip地址特点:
1.每一段范围为[0,255]。
2.不能出现如01、023这种情况。
用深度优先搜索DFS解决
DFS:https://blog.csdn.net/ldx19980108/article/details/76324307
深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。
基本模板:

int check(参数)
{
    if(满足条件)
        return 1;
    return 0;
}

void dfs(int step)
{
        判断边界
        {
            相应操作
        }
        尝试每一种可能
        {
               满足check条件
               标记
               继续下一步dfs(step+1)
               恢复初始状态(回溯的时候要用到)
        }
} 
public class RestoreIpAddresses426 {

    /**
     * 回溯法
     * 。要判断0<=value<=255且不能出现021这种情况
     * @param s
     */
    public static List restoreIpAddresses2(String s) {
        // write your code here
        List res = new ArrayList<>();
        if(s.length()<4||s.length()>12)
            return res;

        dfs(s,new ArrayList<>(),res,0);
        return res;
    }

    private static void dfs(String s,  List list, List res, int index) {
        //list中已存在4段数字字符串了,进入最终处理环节
        if(list.size()==4){
            if(index!=s.length()){
                return;
            }
            StringBuilder ipAddress = new StringBuilder();
            for(String tmp:list){
                ipAddress.append(tmp);
                ipAddress.append(".");
            }
            ipAddress = ipAddress.deleteCharAt(ipAddress.length()-1);
            res.add(ipAddress.toString());
        }
        //以index为起点向后取数字,不超过s的长度而且最多取3个
        for(int i = index;i= 0 && digit <= 255;
    }



    public static void main(String[] args) {
        List result = restoreIpAddresses2("101023");
    }
}

你可能感兴趣的:(LintCode:恢复IP地址【DFS】)