zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    2017.4.6下午
    2017.4.6上午
    2017.3.31下午
    2017.4.5下午
    2017.4.5上午
    2017.4.1上午
    2017.3.31上午
    2017.3.28下午
    2017.3.28上午
    3.28上午
  • 原文地址:https://www.cnblogs.com/skillking/p/9706766.html
Copyright © 2011-2022 走看看