Leetcode93. 复原 IP 地址

题目传送:https://leetcode.cn/problems/restore-ip-addresses/submissions/

运行效率:
Leetcode93. 复原 IP 地址_第1张图片

代码如下:

 public static List<String> restoreIpAddresses(String s) {
        //
        List<String> result = new ArrayList<>();
        Deque<String> deque = new ArrayDeque<>();
        //处理特殊情况
        if(s.length()<4||s.length()>12){
            return result;
        }
        dfs(s,0,deque,result);
        return result;
    }

    /**
     * 校验该字符串 是否能够成为一个 合格ip 段
     *
     * @param str
     * @return
     */
    public static boolean checkSegment(String str) {
        //比如012   肯定就是不行的
        if (str.startsWith("0") && str.length() > 1) {
            return false;
        }
        int i = Integer.parseInt(str);
        //ip分段的数字不能大于255
        return i <= 255;
    }

    public static void dfs(String s, int begin, Deque<String> deque, List<String> res) {
        //处理边界情况
        if (begin == s.length()) {
            if (deque.size() == 4) {
                res.add(String.join(".", deque));
            }
            return;
        }
        //因为合法ip的每一段长度最多是3位
        if ((s.length() - begin) > (4 - deque.size()) * 3) {
            return;
        }
        //对当前ip段进行长度的枚举
        for (int i = 1; i <= 3; i++) {
            if(begin+i<=s.length()){
                String segment = s.substring(begin, begin + i);
                //校验该片段是否是一个合理的ip部分
                boolean b = checkSegment(segment);
                if(b){
                    //典型的回溯法    先add 用完后再remove
                    deque.add(segment);
                    dfs(s,begin+i,deque,res);
                    deque.removeLast();
                }
            }
        }
    }

你可能感兴趣的:(数据结构和算法,leetcode,算法,职场和发展)