zoukankan      html  css  js  c++  java
  • [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();
                    }
                }
            }
        }
    }
    
  • 相关阅读:
    BestCoder Round #86 1001
    Codeforces Round #365 (Div. 2) B
    Codeforces Round #365 (Div. 2) A
    Codeforces Round #129 (Div. 2) C
    Codeforces Round #129 (Div. 2) B
    Android.mk 文件语法详解
    RDS和ROS使用小结
    电力企业计量生产需求系统解决方案
    android 修改framework下资源文件后如何编译
    USB port 如何识别不同的Charger类型
  • 原文地址:https://www.cnblogs.com/acbingo/p/9433475.html
Copyright © 2011-2022 走看看