给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

本文深入探讨了一种从字符串中恢复IP地址的算法实现。通过递归回溯的方法,算法能够找出所有可能的有效IP地址组合,并以列表形式返回。文章详细介绍了如何限制IP段的长度和数值范围,确保生成的IP地址格式正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package program;



import java.util.ArrayList;
import java.util.List;

/**
 * @Auther: 大哥的叔
 * @Date: 2019/10/8 15:00
 * @Description:
 */
public class IP {

    public static void main (String[] args) {
        IP ip = new IP();
        String s ="25525511135";
        ip.restoreIpAddresses(s);
    }
    public List<String> restoreIpAddresses(String s) {
        List<String> ans = new ArrayList<>();//保存最终的所有结果
        backtrack(s,0,new StringBuilder(),ans,0);
        System.out.println(ans);
        return ans;
    }

    /**
     *
     * @param s 传入的参数
     * @param st 开始的位置
     * @param t 临时存储的划分结果
     * @param ans 保存所有的解
     * @param c 当前加入的部分
     */
    private void backtrack(String s,int st,StringBuilder t,List<String> ans,int c){
        //如果剩余的长度大于剩下的部分都取 3 位数的长度,那么直接结束
        if ( (s.length() - st) > (3*(4 - c))){
            return;
        }
        //当前刚好到达了末尾
        if (st == s.length()){
            if (c == 4) {//加入结果
                ans.add(new String(t.substring(0,t.length()-1)));
            }
            return;
        }
        //当前超过末位,或者已经到达了 4 部分结束掉
        if (st>s.length()||c==4){
            return;
        }
        //保存的当前的解
        StringBuilder builder = new StringBuilder(t);
        //加入1
        t.append(s.charAt(st)+""+'.');
        backtrack(s,st+1,t,ans,c+1);

        if (s.charAt(st)=='0')return;
        //加入2#10 33
        if(st+1<s.length()){
            t = new StringBuilder(builder);
            t.append(s.substring(st,st+2)+""+'.');
            backtrack(s,st+2,t,ans,c+1);
        }
        //加入3 #225
        if(st+2<s.length()){
            t = new StringBuilder(builder);
            int n =Integer.parseInt(s.substring(st,st+3));
            if(n>=0&&n<=255){
            t.append(s.substring(st,st+3)+""+'.');
            backtrack(s,st+3,t,ans,c+1);
            }

        }
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值