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();
                    }
                }
            }
        }
    }
    
  • 相关阅读:
    油猴脚本
    js hook
    js控制台原理检测
    安卓so文件函数动态注册
    js一些简单逆向题目实战
    js基础补充落下的知识点
    js反爬原理
    js容易让人眼瞎的写法
    js基础
    js一些常见非指纹built-in函数
  • 原文地址:https://www.cnblogs.com/acbingo/p/9433475.html
Copyright © 2011-2022 走看看