93. Restore IP Addresses

一、题目

  1、审题

  2、分析

    给一个只含有数字的字符串,判断其拆分后满足正确 IP 地址格式的所有组合。

 

二、解答

  1、思路:   

    每个 IP 地址的一项均为 0 ~ 255之间,用 1~3 位数值进行表示,故可以将字符串拆分成四项,且每一项长度为 1~3,再依次判断每项是否为 0 ~ 255 之间,满足即返回。

    利用 三个 for 循环进行字符串的拆分,将所有满足的拆分式返回。

public List<String> restoreIpAddresses(String s) {
        
        List<String> resultList = new ArrayList<String>();
        int len = s.length();
        if(len < 4 || len > 12){
            return resultList;
        }
        
        for (int i = 1; i < 4 && i < len - 2; i++) {    // i 长度 为 1-3, 且剩余长度 >= 3
            for (int j = i+1; j < i+4 && j < len - 1; j++) {    // j 长度为 1-3 , 且剩余长度 >= 2
                for(int k = j+1; k < j+4 && k < len; k++){
                    String s1 = s.substring(0, i);
                    String s2 = s.substring(i, j);
                    String s3 = s.substring(j, k);
                    String s4 = s.substring(k, len);
                    if(isValid(s1) && isValid(s2) && isValid(s3) && isValid(s4))
                        resultList.add(new StringBuffer()
                                        .append(s1).append('.')
                                        .append(s2).append('.')
                                        .append(s3).append('.')
                                        .append(s4).toString()
                                );
                }
            }
        }
        return resultList;
    }
    
    private boolean isValid(String s2) {
        if((s2.length() > 1 && s2.charAt(0) == '0') || Integer.parseInt(s2) > 255)
            return false;
        return true;
    }

 

  优化,利用三个循环直接控制前三个子字符串的长度。更直观

public List<String> restoreIpAddresses(String s) {
        List<String> resultList = new ArrayList<String>();
        int len = s.length();
        if(len < 4 || len > 12){
            return resultList;
        }
        
        for (int a = 1; a <= 3; a++) 
        for (int b = 1; b <= 3; b++) 
        for (int c = 1; c <= 3; c++) {
            int d = len - a - b - c;
            if(1 <= d && d <= 3) {
                String s1 = s.substring(0, a);
                String s2 = s.substring(a, a+b);
                String s3 = s.substring(a+b, a+b+c);
                String s4 = s.substring(a+b+c, len);
                if(isValid(s1) && isValid(s2) && isValid(s3) && isValid(s4))
                    resultList.add(new StringBuffer()
                                    .append(s1).append('.')
                                    .append(s2).append('.')
                                    .append(s3).append('.')
                                    .append(s4).toString()
                            );
            }
        }
        
        return resultList;
    }
    
    private boolean isValid(String s2) {
        if((s2.length() > 1 && s2.charAt(0) == '0') || Integer.parseInt(s2) > 255)
            return false;
        return true;
    }

 

posted @ 2018-09-26 14:38  skillking2  阅读(121)  评论(0编辑  收藏  举报