import java.util.*;


public class Solution {
    /**
     * 
     * @param s string字符串 
     * @return string字符串ArrayList
     */
    public ArrayList<String> restoreIpAddresses (String s) {
        // 向 s 中 插入 3 个点 且每个点 相距 dis 属于 [1,3] ;
        // 通过深度优先 回溯的方式去更新点可以存在的位置 
        // 在一个判定中去判定 最终得到的结果是否符合要求 
        ArrayList<String> ans = new ArrayList<>();
        if(s.length() > 12) return ans;
        dfs(ans,new StringBuilder(),0,s,0);
        return ans;
    }
      // cut_index 代表上一个切点的下标!
     private void dfs(List<String> ans,StringBuilder child,int cut_index,String s,int count){
        if(count == 3){
            // 第一次到达 count == 3
            // 说明 后面的东西 还没 加入到 child 所以还要操作一波 
            child.append(s.substring(cut_index,s.length()));
            if(isLegal(child.toString())){
                ans.add(new String(child.toString()));
            }
            child.delete(child.length() - (s.length() - cut_index) ,child.length()); 
            return ;
        }

        for(int i = 1; i <= 3 && cut_index + i < s.length(); i++){
            child.append(s.substring(cut_index,cut_index + i));
            child.append('.');
            dfs(ans,child,cut_index + i,s,count + 1);
            child.delete(child.length() - i - 1,child.length());// 回溯 
        }

    }

    private boolean isLegal(String address){
        String[] digits = address.split("\\."); // 通过 . 把字符串 拆成四块 (讲道理第一次被转义字符秀了一手) 
        if(digits.length < 4){
            return false;
        }else{
            for(String dress : digits){
                if(Long.parseLong(dress) > 255 || (dress.length() > 1 && dress.charAt(0) == '0')) return false; // 这里用 Long 主要是因为 java 没有 unsign int 
            }
        }
        return true;
    }
}