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; } }

思考

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

  待续...

posted @ 2019-09-29 21:36  子烁爱学习  阅读(323)  评论(0编辑  收藏  举报