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)

 

ip 规则和题解抄自“爱做饭”:) ref http://www.cnblogs.com/springfor/p/3886409.html

利用循环递归解决子问题。对于每个段内数来说,最多3位最少1位,所以在每一层可以循环3次,来尝试填段。因为IP地址最多4个分段,当层数是3的时候说明已经尝试填过3个段了,那么把剩余没填的数段接到结尾即可。

这个过程中要保证的是填的数是合法的,最后拼接的剩余的数也是合法的。

 注意开头如果是0的话要特殊处理,如果开头是0,判断整个串是不是0,不是的话该字符就是非法的。因为001,01都是不对的。

public class Solution {
    public ArrayList<String> restoreIpAddresses(String s) {
        ArrayList<String> res = new ArrayList<String>();
        if(s==null||s.length()<4||s.length()>12) return res;
        dfs(0,1,res,s,"");
        return res;
    }
    private void dfs(int start, int segment, ArrayList<String> res, String s, String item){
        if(start>=s.length()) return;
        if(segment==4){
            String str = s.substring(start);
            if(isValid(str)){
                res.add(item + "." + str);
            }
            return;
        }
        for(int i=1; segment<4 && (i+start)<=s.length();i++){
            String str = s.substring(start, start+i);
            if(isValid(str)){
                if(segment ==1){
                    dfs(start+i, segment+1,res, s, str);
                }else{
                    dfs(start+i, segment+1,res, s, item+"."+str);
                }
            }
        }
    }
    private boolean isValid(String str){
        if(str==null||str.length()>3||(str.charAt(0)=='0'&&str.length()>1)) return false;
        int code = Integer.parseInt(str);
        return (code>=0 && code<=255);
    }
}

 

posted @ 2015-06-09 10:32  世界到处都是小星星  阅读(312)  评论(0编辑  收藏  举报