(不带解释,只有代码java 甚进)复原ip问题,回溯穷举

package com.baiyu.suanfa;

import java.util.*;

/*
递归{
循环 {
判断加点是否达到3。{ 达到判断最后j的后面是不是也是在0到255之间。是就记录。不是就返回}
尝试在第一个i的位置加点 j上次加点的位置
判断j i+1字符串是不是在0到255之间
如果不是 继续循环[下一个i +1位置加点]
如果是[
递归{
i+1位置加点
}
递归结束条件,i到达了字符串长度-1
]
}

}
*/
public class ip_fen_ge_wen_ti {
    static ArrayList> result = new ArrayList();
    static LinkedList path = new LinkedList();

    public static void main(String[] args) {
        String s = "25525511135";
        int len = s.length();
        System.out.println("字符串长度:" + len);
        backtracking(0, s, 0, len);

        for (List re : result) {
            System.out.println(re.get(0)+"."+re.get(1)+"."+re.get(2)+"."+re.get(3));
        }
    }

    static void backtracking(int j, String str, int pn, int len) {
        if ((j + 1) >= len) {
            return;
        }
        if (pn == 3) {
            String ss = str.substring(j);
            Long i2 = Long.valueOf(ss);
            if (i2 <= 255 && i2 >= 0) {
                LinkedList longs = new LinkedList<>(path);
                longs.add(i2);
                result.add(longs);
            }
            return;
        }

        for (int k = j; k < len; k++) {
            String s1 = str.substring(j, k + 1);
            Long i1 = Long.valueOf(s1);
            if (i1 <= 255 && i1 >= 0) {
                path.add(i1);
                backtracking(k + 1, str, pn + 1, len);
                path.removeLast();
            }
//            else {
//                continue;
//            }

        }


    }

}

总结: 毕竟自己花了3个小时甚至4小时写出来的,在循环里面开始递归。这是我得到的规律,

树形图:

        a  

     /      \

b              c

循环a 在循环里面写递归 

 

你可能感兴趣的:(java,开发语言)