简单易懂思路:递归遍历字符串的每一位,由于每一位只可能是以下两种情况:与前面几位组成未满255,仍能继续往后结合的,与前面几位组成未满255,需要在该位后面加'.'的。因此,在递归种把这两种情况分离即可。采用一个list记录下每个'.'之间的数字,并且结束递归时,这个list的长度应该为4,因为IP地址有4段。最后每个字符串中,符合IP地址的字符串一定比原串长度大3(因为加了3个'.'),

public class Solution {
    ArrayList<String> res = new ArrayList<>();
    public ArrayList<String> restoreIpAddresses (String s) {
        func(0,0,s,new ArrayList<Integer>());
        return res;
    }
    public void func(int index,int cur,String s,ArrayList<Integer> templist){
        if(index==s.length()){
            if(templist.size()==4){
                String str = "";
                for(int i=0;i<templist.size();++i){
                    if(templist.size()-1!=i)
                        str+=templist.get(i)+".";
                    else str+=templist.get(i);
                }
                if(str.length()!=s.length()+3)return;
                res.add(str);
            }
            return ;
        }
        int temp = cur*10+s.charAt(index)-'0';
        if(temp>=0&&temp<=255){
            func(index+1,temp,s,new ArrayList<Integer>(templist));
            templist.add(temp);
            func(index+1,0,s,new ArrayList<Integer>(templist));
        }
    }
}