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;
        }
  • 相关阅读:
    FileUpload的使用
    关于hibernate4的配置我要好好反省一下
    比较SQL Server 2000 数据库中两个库的差异
    用google生活
    用OWC11图形分析本页面及其他页面Table中的数据
    请教ASP.NET培训应该培训的内容和以及顺序
    最近一个快要结束的项目的BUG分析
    我也发软件开发团队的思考(侧重点是人员)
    一个SQL语句的问题,我百思不得其解,请教各位
    分享C#高端视频教程
  • 原文地址:https://www.cnblogs.com/skillking/p/9706766.html
Copyright © 2011-2022 走看看