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

    }
}
posted @ 2021-04-26 21:31  wsshub  阅读(64)  评论(0)    收藏  举报