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

    }

}

 

你可能感兴趣的:(store)