码迷,mamicode.com
首页 > 其他好文 > 详细

回溯---IP 地址划分

时间:2019-06-30 20:45:46      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:int   ems   arraylist   删除   pre   长度   i++   substring   tps   

IP 地址划分

93. Restore IP Addresses(Medium)

Given "25525511135",
return ["255.255.11.135", "255.255.111.35"].

题目描述:

??根据所给的字符串,返回所有划分的合法IP地址。

思路分析:

??这道题其实就是一个深度优先遍历的过程。ip有4个段,每个段的字符个数可能是1,2,3,因此对每一段循环取1,2,3,然后标记当前对应的是ip段的哪个段,直到ip段已经分为4个段,并且取完了string这个时候取到一个合法的ip放入最后的结果中。对每次处理的时候如果按照每次取i个字符处理之后,调用递归取后面的段时,需要将前面取的i个字符去掉,因为如果这里取的满足条件那么后面一定已经存放到结果中。现在需要新起一个开头处理。

代码:

public List<String>restoreIpAddresses(String s){
    List<String>res=new ArrayList<>();
    if(s==null||s.length()==0)
        return res;
    StringBuilder str=new StringBuilder();
    findIp(0,s,str,res);
    return res;
}
public void findIp(int k,String s,StringBuilder str,List<String>res){
    if(k==4||s.length()==0){
        if(k==4&&s.length()==0)//分成了四段并且str没有剩余
            res.add(str.toString());
        return ;
    }
    for(int i=0;i<s.length()&&i<=2;i++){
        if(i!=0&&s.charAt(0)=='0')
            break;    //该段的长度不为1,但是字符串首字母为0,那么不符合ip命名方式,直接退出,例如:01.100.22.33其地址应该为1.100.22.33
        String part=s.substring(0,i+1); 
        if(Integer.valueOf(part)<=255){
            if(str.length()!=0){//不是首段,则要加上段分隔符
                part='.'+part;
            }
            str.append(part); //添加
            findIp(k+1,s.substring(i+1),str,res); //k表示第几段
            str.delete(str.length()-part.length(),str.length()); //删除
        }
    }
}

回溯---IP 地址划分

标签:int   ems   arraylist   删除   pre   长度   i++   substring   tps   

原文地址:https://www.cnblogs.com/yjxyy/p/11111023.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!