回溯算法-----复原IP地址(Java版本)

题目

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 '.' 分隔。

 

示例:

输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]

解决方法

    //回溯用
    LinkedList<String> linkedList = new LinkedList<>();
    //保存结果用
    List<String> result = new ArrayList<>();

    public List<String> restoreIpAddresses(String s) {
        dfs(s,0,0);
        return result;

    }

    public void dfs(String string,int dort,int curIndex){
        //判断点的个数 如果是3个点 都满足 那么就是真的ip地址 
        // 回溯   结束的条件 就是具备三个点
        //对于每一个点  各种情况  如果说其中有一个后续直接不满足 回溯

        //如果当前的index 超过了字符串的长度  返回
        if (curIndex >= string.length()) {
            return;
        }

        //如果当前的字符串是0 那么后面就不能增加字符串了,因为不能出现01.01.01.01 这种
        int max = string.charAt(curIndex) == '0' ? 1 : 3;
        for (int i = 1; i <= max; i++) {
            //保证不要超过整个字符串大小
            if (curIndex + i > string.length()) {
                continue;
            }
            //截取字符串
            String substring = string.substring(curIndex, curIndex + i);
            //如果是合理的字符串 (0<x <255)
            if (!isInvalidate(substring)) {
                continue;
            }
            //增加
            linkedList.add(substring);

            //如果是第三个点 那么就是结束的时候了
            if (dort == 3) {
                //如果当前的长度是整个数组的长度 那么就是结束的时候了
                if (curIndex + substring.length() == string.length()) {
                    //添加结果
                    String join = String.join(".", linkedList);
                    result.add(join);

                }
            }else {
                //如果不是最后一个点  那么添加下一个点
                dfs(string,dort + 1,curIndex + substring.length());
            }
            //回溯
            linkedList.pollLast();
        }

    }
    public boolean isInvalidate(String string){
        return string.length() <= 3  && Integer.parseInt(string) <= 255;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章