思路分析:使用递归,只可意会不可言传(分类讨论,太难了)
class Solution {
static final int idcount=4;
List<String> list=new ArrayList<>();
int[] segment=new int[idcount];//存放每个部分的合法数据
public List<String> restoreIpAddresses(String s) {
def(s,0,0);
return list;
}
public void def(String s,int id,int segstart){
if(id==idcount){//前四个部分已经分割好了
if(segstart==s.length()){
String container="";
for (int i = 0; i < idcount; i++) {
container=container+(segment[i]+"");
if(i<(idcount-1)){
container=container+".";
}
}
list.add(container);
}
return;//说明已经获取到了一种解法,可以回溯寻找下一种解法
}
if(segstart==s.length()){//前四个部分没有分割好,就已经没有解法了(例如出现了:s="123")
return;//回溯
}
if(s.charAt(segstart)=='0'){//直接进行下一个部分的递归即可
segment[id]=0;
def(s,id+1,segstart+1);
}
int add=0;//不断加大这个部分的数据
for (int i = segstart; i <s.length() ; i++) {
add=add*10+(s.charAt(i)-'0');//转换为是进制的数字
if(add>0&&add<=255){
segment[id]=add;
def(s,id+1,i+1);//注意:下一次的开始扫描的下标更新了。说明这个部分找到了,继续递归。
// 如果递归到已经有了解法,就会相当于一个无参数的操作,这时for循环继续加大数据(观察这个部分的其可能情况,例如:从2变为23,从23变为234)
}else{
break;//如果这时,例如:从35变为356已经很大了--超过255,就已经没有必要后移扫描s继续加大这个部分的数据了
// (这个部分不需要继续讨论,应该给要回溯了)
}
}
}
}
发现使用stringbuffer()函数来进行字符串的拼接的时间真的很短了:
这里ipAddr.tostring()是因为list是string类型的,要将stringbuffer类型转换为string类型
同理:下面将StringBuffer转换为了Integer