LeetCode93-复原IP地址

LeetCode93-复原IP地址

题目

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

有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。

示例
输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]

解法

思路:将三个点插入到这一个字符串中,将字符串分割成4个部分,每个部分进行检查,如果是在0-255之间,则成立。

优化剪枝:

(1)字符串长度为len,当分割点分割i出来第i段,但是len-3*(4-i)>0,则表明这一段不成立,这个分割点要继续向后遍历。
(2)若某个分割点分割出来的字符段已经不属于0-255之间,那么这个分割点当前和向后遍历出来的所有段落,都没有用了,直接break这个循环。、

注意:
分割出来的ip地址,若某个段落长度大于1,但是首个字符是0,则证明这个字符段是非法的。

class Solution {
    public List<String> restoreIpAddresses(String s) {
        List<String> res = new LinkedList<>();
        int len = s.length();
        if(len < 4 || len > 12) return res;
        for(int i = 1 ; i <= 3 && i < len - 2; ++i){
        	//若后面的字符段太长,以至于不能分割出三个长度都小于等于3的字符段
        	//则这个分割点应该继续向后遍历。
            if(i<len - 9) continue;
            String curA = s.substring(0,i);
            //若这个分割点分割出的字符段是不符合0-255之间标准的
            //则不用继续向后遍历,直接跳出这个循环
            if(!isTrue(curA)) break;
            for(int j = i + 1; j <= i + 3 && j < len - 1; ++j){
                if(j<len-6) continue;
                String curB = s.substring(i,j);
                if(!isTrue(curB)) break;
                for(int l = j + 1; l <= j + 3 && l < len ; ++l){
                    if(l<len-3) continue;
                    String curC = s.substring(j,l);
                    String curD = s.substring(l,len);
                    if(isTrue(curC)&&isTrue(curD)){
                        StringBuilder stb = new StringBuilder();
                        stb.append(curA);
                        stb.append('.');
                        stb.append(curB);
                        stb.append('.');
                        stb.append(curC);
                        stb.append('.');
                        stb.append(curD);
                        res.add(stb.toString());
                    }
                }
            }
        }
        return res;
    }
    public boolean isTrue(String s){
        
        int len = s.length();
        //若这个字符段第一个字符是0,但是长度不为0,则非法
        if(s.charAt(0)=='0' && len > 1) return false;
        int sum = 0;
        for(int i = 0; i < len ; ++i){
            sum = sum * 10 + s.charAt(i)-'0';
        }
        if(sum<=255) return true;
        return false;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值