Restore IP Addresses

https://leetcode.com/problems/restore-ip-addresses/
IP切分,给出一个字符串,求出能切分成字符串的所有可能
例:Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]

 public List restoreIpAddresses(String s) {
        List res = new ArrayList();
        if (s == null || s.length() == 0 || s.length() < 4 || s.length() > 12) {
            return res;
        }
        IpHelper(s, 0, "", res);
        return res;
    }

    //怎么翻译这个function,怎么翻译?怎么翻译?怎么翻译?怎么翻译?
    //对于输入string s,当前递归到了第n段(一个IP段总共由4个0~255的int组成)
    //临时的结果out
    //最终结果res
    public void IpHelper(String s, int n, String out, List res) {
        //当n此时为第4段的时候,IP段走到了int的最后一个int
        if (n == 4) {
            //当s为空的时候,out此时可以作为一个结果
            //至于out是不是合法的,在上一个迭代的val那一步已经判断的,所以一定是合法的
            if (s.isEmpty()) {
                res.add(out);
            }
            return;
        }

        //k表明取s子串的个数,因为每一个数字都在0~255之间,所以子串的位数是在1~3之间
        for (int k = 1; k < 4; k++) {

            //可能出现剩余的s本身就不够3位了,所以循环直接终止
            if (s.length() < k) {
                break;
            }

            //针对s,直接取大小为k的子串,并转换为整形
            int val = Integer.parseInt(s.substring(0, k));

            //整形的范围判断,大于255 则失败
            //第二个条件,为了避免255010123321,这是切分了255.010.123.321,当此时的val是010,intval后为10,不符合条件
            // "10"的length为2,而此时k为3
            if (val > 255 || k != String.valueOf(val).length()) {
                continue;
            }

            //来来来,我们先翻译一下s.substring(k)
            //Returns a string that is a substring of this string. The
            //substring begins with the character at the specified index and
            //extends to the end of this string.
            //所以255255123123 ,k=1的时候  s.substring(1) = 55255123123,当k=2,3的时候类推
            //下一个迭代,需要计算下一个int,所以n+1
            IpHelper(s.substring(k), n + 1, out + s.substring(0, k) + (n == 3 ? "" : "."), res);
        }
    }

你可能感兴趣的:(Restore IP Addresses)