Given a string containing only digits, restore it by returning all possible valid IP address combinations.

Example:

Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]
class Solution {
public List<String> restoreIpAddresses(String s) {
        List<String> res = new ArrayList<String>();
        int len = s.length();
        StringBuffer ip = new StringBuffer();
         for (int a=1; a<=3; a++){
             for (int b=1; b<=3; b++){
                 for (int c=1; c<=3; c++){
                     int d = len - a - b - c;
                     if ( d > 0 && d <= 3 && a+b+c+d == s.length()) {
                         int A = Integer.parseInt(s.substring(0, a));
                         int B = Integer.parseInt(s.substring(a, a+b));
                         int C = Integer.parseInt(s.substring(a+b, a+b+c));
                         int D = Integer.parseInt(s.substring(a+b+c));
                         if (A<=255 && B<=255 && C<=255 && D<=255){
                             ip.append(A).append(".").append(B).append(".").append(C).append(".").append(D);
                             if( ip.length() == len + 3){
                                 res.add(ip.toString());
                             }
                             ip = new StringBuffer();
                         }
                     }   
                 }
             }
         }
        return res;
    }
}

疯狗式解法。

class Solution {
   public List<String> restoreIpAddresses(String s) {
        List<String> result = new ArrayList<>();
        doRestore(result, "", s, 0);
        return result;
    }
    
    private void doRestore(List<String> result, String path, String s, int k) {
        if (s.isEmpty() || k == 4) {
            if (s.isEmpty() && k == 4)
                result.add(path.substring(1));
            return;
        }
        for (int i = 1; i <= (s.charAt(0) == '0' ? 1 : 3) && i <= s.length(); i++) { // Avoid leading 0
            String part = s.substring(0, i);
            if (Integer.valueOf(part) <= 255)
                doRestore(result, path + "." + part, s.substring(i), k + 1);
        }
    }
}

注意ip地址并不能以0开头比如01.01.01.01,只能由1个0开头

public List<String> restoreIpAddresses(String s) {
    List<String> ans = new ArrayList<>(); //保存最终的所有结果
    getAns(s, 0, new StringBuilder(), ans, 0);
    return ans;
}

/**
* @param:  start 字符串开始部分
* @param:  temp 已经划分的部分
* @param:  ans 保存所有的解
* @param:  count 当前已经加入了几部分
*/
private void getAns(String s, int start, StringBuilder temp, List<String> ans, int count) {
    //如果剩余的长度大于剩下的部分都取 3 位数的长度,那么直接结束
    //例如 s = 121231312312, length = 12
    //当前 start = 1,count 等于 1
    //剩余字符串长度 11,剩余部分 4 - count = 3 部分,最多 3 * 3 是 9
    //所以一定是非法的,直接结束
    if (s.length() - start > 3 * (4 - count)) {
        return;
    }
    //当前刚好到达了末尾
    if (start == s.length()) {
        //当前刚好是 4 部分,将结果加入
        if (count == 4) {
            ans.add(new String(temp.substring(0, temp.length() - 1)));
        }
        return;
    }
    //当前超过末位,或者已经到达了 4 部分结束掉
    if (start > s.length() || count == 4) {
        return;
    }
    //保存的当前的解
    StringBuilder before = new StringBuilder(temp);

    //加入 1 位数
    temp.append(s.charAt(start) + "" + '.');
    getAns(s, start + 1, temp, ans, count + 1);

    //如果开头是 0,直接结束
    if (s.charAt(start) == '0')
        return;

    //加入 2 位数
    if (start + 1 < s.length()) {
        temp = new StringBuilder(before);//恢复为之前的解
        temp.append(s.substring(start, start + 2) + "" + '.');
        getAns(s, start + 2, temp, ans, count + 1);
    }

    //加入 3 位数
    if (start + 2 < s.length()) {
        temp = new StringBuilder(before);
        int num = Integer.parseInt(s.substring(start, start + 3));
        if (num >= 0 && num <= 255) {
            temp.append(s.substring(start, start + 3) + "" + '.');
            getAns(s, start + 3, temp, ans, count + 1);
        }
    }

}