class Solution {
// 存放所有的合法的IP地址(string)
List<String> result=new ArrayList<>();
// 如果找到了 4 段 IP 地址并且遍历完了字符串,那么就是一种答案[1,2,33,224]
// 其余的答案从其他递归dfs里面找[1,2,23,234]
// 存放一个ip地址——使用整形数组的形式 4段segments[segId]
//[1,1,234,123]
int[] anip=new int[4];
public List<String> restoreIpAddresses(String s) {
//从0开始搜,将要搜索的为以一个IP的第0段
dfs(s,0,0);
return result;
}
//加入一个结果
void dfs(String s,int SegId,int start){
//是否是第四段
if(SegId==4){//dfs存入其中一个结果的代码
//遍历完了字符串才加入 否则不加入
if(start==s.length()){
//1、把每个int[] anip里面的值放到stringBuilder(还要加上三个分隔符.)
//2、把stringBuilder里面的值变成String,放到result里面
StringBuilder builder=new StringBuilder();
for(int i=0;i<4;i++){
builder.append(anip[i]);
if(i!=3){
builder.append('.');//最后一段不用加入.
}
}
result.add(builder.toString());
}
return;//得到一种结果本次递归结束 return
}
//不是第四段但是超出搜索范围了
if(start==s.length()){
return;//本次递归未得到结果 return
}
//不是第四段,但是下一段的首个字母为0
// 由于不能有前导零,如果当前数字为 0,那么这一段 IP 地址只能为 0
if(s.charAt(start)=='0'){
//第SegId为0,继续从start+1 搜索第SegId+1段
anip[SegId]=0;
dfs(s,SegId+1,start+1);
}
//其余不是第四段,且还可以继续向下正常搜索
int sum=0;
for(int i=start;i<s.length();i++){
sum=sum*10+(s.charAt(i)-'0');
if(sum>0&&sum<=255){//该段符合
anip[SegId]=sum;
dfs(s,SegId+1,i+1);
}
//如果sum不符合则该次搜索结束
else{
break;
}
}
return;
}
}