zoukankan      html  css  js  c++  java
  • LeetCode:复原IP地址【93】

    LeetCode:复原IP地址【93】

    题目描述

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

    示例:

      输入: "25525511135"
      输出: ["255.255.11.135", "255.255.111.35"]

    题目分析

      ip地址由三个小数点(.)分割成四段,每一段取值为0~255。所以输入字符串s最长为12,最少为4位

      以2556....来划分的话,第一段有可能是下面三种情况:

    • 255,此段为3个
    • 25,此段为2个
    • 2,此段为1个

      所以采用递归框架,从某一位置开始,往后依次截取3、2、1,但是如果某一段截取到的情况是下面两种则不用继续深入:

    • >255,大于255此段不合适,说明此段不应该截取长度为3。
    • 0XX或0X,如果此段为0开头,是不合理,说明此段不应该截取长度为3或2,只能为1,即0作为单独一段。 

      即剪枝条件:不能以0开头,不能大于255.

    Java题解

    class Solution {
        public List<String> restoreIpAddresses(String s) {
            List<String> result = new ArrayList<>();
            if(s.length()>12||s.length()<4)
                return result;
            digui(result,s,0,0);
            return result;
        }
    
        
        public void digui(List<String> list,String tmp,int pos,int count){
            //结束条件
            if(count==3){
                if(pos+3>tmp.length()-1&&isValid(tmp.substring(tmp.lastIndexOf(".")+1)))
                    list.add(tmp);
            }
    
            //业务处理
            if(pos+3<tmp.length()&&isValid(tmp.substring(pos,pos+3))){
                String thirdTmp = tmp.substring(0,pos+3)+"."+tmp.substring(pos+3);
                digui(list,thirdTmp,pos+4,count+1);
            }
            if(pos+2<tmp.length()&&isValid(tmp.substring(pos,pos+2))){
                String secondTmp = tmp.substring(0,pos+2)+"."+tmp.substring(pos+2);
                digui(list,secondTmp,pos+3,count+1);
            }
            if(pos+1<tmp.length()){
                String firstTmp = tmp.substring(0,pos+1)+"."+tmp.substring(pos+1);
                digui(list,firstTmp,pos+2,count+1);
            }
    
        }
    
        public boolean isValid(String s){
            int val = Integer.valueOf(s);
            if(val>255)
                return false;
         //用于处理0XX或0X的情况 if(!String.valueOf(val).equals(s)) return false; return true; } }

    思考

      暴力通常可以解决问题,但是肯定不是最高效的方法,这里对字符串的处理占用了太多内存和时间。有没有更好的办法呢?

      待续...

  • 相关阅读:
    flink on yarn部分源码解析 (FLIP-6 new mode)
    flink on yarn部分源码解析
    flink window的early计算
    【flink training】 打车热点区域实时统计PopularPlaces
    troubshooting-sqoop 导出 TiDB表数据报com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
    Hive2.0常用函数(对编辑器很无语😓)
    Hive正则表达式
    troubleshooting-Container 'PHYSICAL' memory limit
    Hive-查询结果导入到 MySQL
    Hive-复制表
  • 原文地址:https://www.cnblogs.com/MrSaver/p/11610149.html
Copyright © 2011-2022 走看看