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;
}
}