93. 复原 IP 地址
按照回溯框架写出来了大概。
卡在细节的地方:
1.依靠当前元素位置来结束递归,下标的边界搞错了。是if(now==ss.length-1)而不是if(now==ss.length)
2.老问题。写经典递归和回溯常出现的错误:
dfs(ss,i+1,path+num+'.',segment+1,i);
//递归回溯老毛病又犯了。第二个参数是i+1不是cur+1!!!
3.对于非法数字出结束递归,0的位置有特别的判断。
class Solution {
LinkedList<String> ans=new LinkedList<>();
public List<String> restoreIpAddresses(String s) {
//if(s.length()<4||s.length()>12)return ans;
char[] ss=s.toCharArray();
dfs(ss,0,"",1,0);
return ans;
}
void dfs(char[] ss,int cur,String path,int segment,int now){//每段以ss[cur]为起点开始的IP地址
if(segment==5){
if(now==ss.length-1)
ans.add(path);
return;
}
int num=0;
boolean isZeroBefore=false;
for(int i=cur;i<ss.length;i++){
num=num*10+(ss[i]-'0');
if(isZeroBefore)return;
if(num==0)
isZeroBefore=true;
if(num>255)return;//本段数字不合法,回到上一段重新分
if(segment!=4)
dfs(ss,i+1,path+num+'.',segment+1,i);//递归回溯老毛病又犯了。第二个参数是i+1不是cur+1!!!
else
dfs(ss,i+1,path+num,segment+1,i);
}
}
}

浙公网安备 33010602011771号