[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;
    }
}
原文地址:https://www.cnblogs.com/qiaomu/p/4651777.html