16.复原IP地址(字符串拼接最好使用stringbuffer)

在这里插入图片描述
思路分析:使用递归,只可意会不可言传(分类讨论,太难了)

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在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值