[leetcode] 93. 复原IP地址

93. 复原IP地址

这题其实就是91. 解码方法的一个变型。解法完全一样。

dfs(int k, int p, String s, Stack cur, List ans),k表示当前状态下剩余可以搜的个数,p表示还需要搜几个数,cur是个栈,表示当前已经搜到的数

注意下约束关系,去处理就好了

class Solution {
    public List<String> restoreIpAddresses(String s) {
        if ("".equals(s)) return new ArrayList<>();
        List<String> ans = new ArrayList<>();
        Stack<String> cur = new Stack<>();
        dfs(s.length(), 4, s, cur, ans);
        return ans.stream().distinct().collect(Collectors.toList());
    }

    public void dfs(int k, int p, String s, Stack<String> cur, List<String> ans) {
        if (k == 0 && p == 0) {
            StringBuilder tmp = new StringBuilder();
            for (int i = 0; i < cur.size() - 1; i++) {
                tmp.append(cur.get(i)).append(".");
            }
            tmp.append(cur.peek());
            ans.add(tmp.toString());
            return;
        }
        //如果剩下的数太长
        if (p * 3 < k) return;
        //如果剩下的数太短
        if (p > k) return;
        for (int i = 1; i <= 3; i++) {
            if (i == 1) {
                cur.push("" + s.charAt(s.length() - k));
                dfs(k - 1, p - 1, s, cur, ans);
                if (!cur.isEmpty()) cur.pop();
                // 注意,首位不能是0,像这种01.01.01.01是不可以的
            } else if (i == 2 && k > 1 && s.charAt(s.length() - k) != '0') {
                cur.push("" + s.charAt(s.length() - k) + s.charAt(s.length() - k + 1));
                dfs(k - 2, p - 1, s, cur, ans);
                if (!cur.isEmpty()) cur.pop();
            } else if (i == 3 && k > 2 && s.charAt(s.length() - k) != '0') {
                // 只允许<=255
                String sub = s.substring(s.length() - k, s.length() - k + 3);
                int tmp = Integer.parseInt(sub);
                if (tmp <= 255) {
                    cur.push(sub);
                    dfs(k - 3, p - 1, s, cur, ans);
                    if (!cur.isEmpty()) cur.pop();
                }
            }
        }
    }
}
原文地址:https://www.cnblogs.com/acbingo/p/9433475.html