zoukankan      html  css  js  c++  java
  • [leedcode 93] Restore IP Addresses

    Given a string containing only digits, restore it by returning all possible valid IP address combinations.

    For example:
    Given "25525511135",

    return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)

    public class Solution {
        List<String> res;
        StringBuilder seq;
        public List<String> restoreIpAddresses(String s) {
        /*  采用递归的解法。基本思路就是取出一个合法的数字,作为IP地址的一项,然后递归处理剩下的项。
            可以想象出一颗树,每个结点有三个可能的分支(因为范围是0-255,所以可以由一位两位或者三位组成)。
            并且这里树的层数不会超过四层,因为IP地址由四段组成,到了之后我们就没必要再递归下去,可以结束了。
            递归结束的条件是遍历完4段,字符串也恰好读完了。可以看出这棵树的规模是固定的,
            时间复杂度取决于输入的规模,是指数量级的,所以这道题并不是NP问题,因为他的分支是四段,有限制。*/
    
            res=new ArrayList<String>();
            seq=new StringBuilder();
            getIpAddress(s,0,1);//index  segment
            return res;
        }
        public void getIpAddress(String s,int index,int seg){
            if(seg>4){//递归截止的条件,大于4段,并且不存在多余的字符
                if(index==s.length()){
                    res.add(new String(seq));
                }
                return;
            }
            
            for(int i=1;i<4&&(index+i)<=s.length();i++){//DFS,注意要删除seq的值
                String temp=s.substring(index,index+i);
                if(isvalid(temp)){
                    if(seg==1){
                        seq.append(temp);
                    }else{
                        seq.append("."+temp);
                    }
                    getIpAddress(s,index+i,seg+1);
                    int t=seg==1?0:1;
                    seq.delete(seq.length()-i-t,seq.length());
                }
            }
                   
        }
        public boolean isvalid(String s){//验证每一段是否满足要求,不能是“01”,不能大于三位,范围在0 到255
            if(s==null||s.length()>3) return false;
            if(s.length()>1&&s.charAt(0)=='0') return false;
            int temp=Integer.parseInt(s);/////
            if(temp>=0&&temp<=255) return true;
            return false;
        }
    }
  • 相关阅读:
    C++指针
    Linux Ubuntu常用终端命令
    java-JDBC-Oracle数据库连接
    HDU 1890 区间反转
    Hdu-3487 Splay树,删除,添加,Lazy延迟标记操作
    UVa 10088
    UVa10025-The ? 1 ? 2 ? ... ? n = k problem
    UVa10023手动开大数平方算法
    UVa 10007
    点的双联通+二分图的判定(poj2942)
  • 原文地址:https://www.cnblogs.com/qiaomu/p/4651777.html
Copyright © 2011-2022 走看看