复原IP地址

93.复原ip地址
题解:dfs+剪枝,使用一个集合path用来存储每次放入的满足条件的字符串,首先判断字符串的长度,如果大于12或者小于4直接返回一个空的集合。
深度搜索过程中,出口是当满足条件的分段数量达到4并且字符串全部遍历完
的时候,就可以把path放入到我们的集合当中。用一个长度为3的循环进行
剪枝,判断当前字符串是否满足条件,将我们的字符串放入到我们的path中,然后进一步深度搜索,注意要回溯。

class Solution {
    private int len;
    private String str;
    private List<String> ansList;
    private Deque<String> path;

    public List<String> restoreIpAddresses(String s) {
        len = s.length();
        str = s;
        //判断长度,不满足直接输出
        if (str == null || len < 4 || len > 12) {
            return new ArrayList<>();
        }
        ansList=new ArrayList<>();
        path=new LinkedList<>();
        dfs(0,0);
        return ansList;
    }

    public int judge(int start,int end){
        //如果第一个数是0的话,那么只能是一位数,也就是锁start必须等于end
        if(str.charAt(start)=='0'&&start!=end){
            return -1;
        }
        int sum=0;
        //求出大小
        for(int i=start;i<=end;i++){
            int x=str.charAt(i)-'0';
            sum=sum*10+ (str.charAt(i)-'0');
        }
        //范围判断
        if(sum>255){
            return -1;
        }
        return sum;
    }
    public void dfs(int start,int cnt) {
        //已经被彻底被分成四段,并且长度满足
        if(cnt==4&&start==len){
            //并且长度满足
            ansList.add(String.join(".",path));

        }
        //剪枝
        for(int i=start;i<start+3&&i<len;i++){
            //判断是否可以剪枝
            int flag=judge(start,i);
            if(flag!=-1){
                //将满足的分段加入到path中
                path.addLast(flag+"");
                //继续深搜
                dfs(i+1,cnt+1);
                //回溯
                path.removeLast();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值