回溯:
1.先定义一个接收的集合,之后再定义一个记录小数点的变量。之后编写回溯函数,终止条件为小数点的个数为3时,同时要判断最后一段的组合的值是否属于ip地址的范围。之后再用for循环来遍历ip地址的组合,先判断组合的ip地址是否符合,符合就用substring()将小数点加入到字符串中 同时小数点的个数加一,之后用嵌套的方式来寻找下一个ip地址,结束后在回溯操作。再写一个检查ip地址值是否符合的函数。
class Solution {
//接收的集合
List<String> li=new ArrayList<>();
//记录小数点的个数
int fuhao=0;
public List<String> restoreIpAddresses(String s) {
//调用回溯函数
huisu(s,0,s.length());
return li;
}
//回溯函数
public void huisu(String s,int Index,int length){
//终止条件
if(fuhao==3){
//判断最后一段ip值是否有效
if(isIp(s,Index,s.length()-1)){
li.add(s);
}
return ;
}
//for循环遍历ip地址的组合
for(int i=Index;i<length;i++){
//判断组合是否是属于0到255的范围
if(isIp(s,Index,i)){
//将小数点加入到字符串中
s=s.substring(0,i+1)+"."+s.substring(i+1);
//小数点的个数加一
fuhao++;
//嵌套调用
huisu(s,i+2,s.length());
//回溯操作来进行重新组合
s=s.substring(0,i+1)+s.substring(i+2);
fuhao--;
}else{
break;
}
}
}
//检查组合是否是符合0到255的函数
public boolean isIp(String s,int Index,int is){
if(Index>is){
return false;
}
//前导不能为0
if(s.charAt(Index)=='0'&&is-Index>0){
return false;
}
//组合是否满足0到255
int sum=0;
for(int i=Index;i<=is;i++){
sum=sum*10+(s.charAt(i)-'0');
if(sum>255){
return false;
}
}
return true;
}
}