LeetCode93. 复原IP地址

☆☆☆☆思路:回溯算法.

      回溯算法事实上就是在一个树形问题上做DFS。因此,需要先将原问题转化为树形问题

      每一个节点可以选择截取的方法有三种:截1位、截2位、截3位。因此每一个结点可以生长出的分支最多只有 3 条分支;

      由于 ip 段最多就 4 个段,因此这棵三叉树最多 4 层,这个条件作为递归终止条件之一;

class Solution {
    public List<String> restoreIpAddresses(String s) {
        List<String> res = new ArrayList<>();
        if (s.length() < 4 || s.length() > 12) return res;
        dfs(s, 0, new ArrayList<>(), res);
        return res;
    }
    private void dfs(String s, int pos, List<String> list, List<String> res) {
        if (list.size() == 4) {
            if (pos == s.length()) {
                // join 用法:例如 [[255],[255],[111],[35]] -> 255.255.111.35
                res.add(String.join(".", list));
            }
            return;
        }
        // ip 地址每段最多有三个数字
        for (int i = 1; i <= 3; i++) {
            if (pos + i > s.length()) {
                break;
            }
            String tmp = s.substring(pos, pos + i);
            // 剪枝条件:段的起始位置不能为 0,段拆箱成 int 类型的长度不能大于 255
            int val = Integer.parseInt(tmp);
            if (tmp.startsWith("0") && tmp.length() > 1 || (i == 3 && val > 255)) {
                continue;
            }
            list.add(tmp);
            dfs(s, pos + i, list, res);
            list.remove(list.size() - 1);
        }
    }
}
原文地址:https://www.cnblogs.com/HuangYJ/p/14193863.html