算法之数字转ip

给定一串数字,通过相邻数字的左右组合,求出其所有的ip组合,例如"25525511135"的所有组合为:["255.255.11.135", "255.255.111.35"].
该道题可以使用深搜+回溯算法得出符合要求的结果。
在每次深搜的每次操作中,可以对数字进行1到3位的截取,如果截取了3次之后再无可截取时,正好可组合为一个ip。具体算法如下:

public class JavaTest {
    public static void main(String[] args) {
        numberToIp("25525511135");
    }

    private static void numberToIp(String src) {
        List> result = new ArrayList<>();
        numberToIp(src, result, new LinkedList(), 0);
        
        // 输出所有转换的ip结果
        for (LinkedList r: result) {
            for(int p: r) {
                System.out.print(p+" ");
            }
            System.out.println();
        }
    }

    /**
     * @param src 事件源
     * @param result 记录的总结果
     * @param path 一次深搜的结果
     * @param index 当前的定位点
     */
    private static void numberToIp(String src, List> result, LinkedList path, int index) {
        // 如果path存储个数以达到4个,但src仍未截取完,则不再需要继续截取,
        // 因为ip只有4位,该次深搜作废
        if (index < src.length() && path.size() == 4) return;
        // 正好截满4个,则做该次深搜结果存储操作
        if (index == src.length() && path.size() == 4) {
            result.add((LinkedList) path.clone());
            return;
        }

        // 每次可以从index开始往后截取i个位置
        for (int i = 1; i <= 3; i++) {
            // 越界剪枝
            if (index + i <= src.length()) {
                int number = Integer.parseInt(src.substring(index, index + i));
                // ip逻辑剪枝
                if (number > 255) continue;
                path.addLast(number);
                numberToIp(src, result, path, index + i);
                // 该次深搜完毕,重置,开始下一个深搜
                path.removeLast();
            }
        }
    }
}

你可能感兴趣的:(算法之数字转ip)