每日一题——复原IP地址

菜鸡每日一题系列打卡93

每天一道算法题目 

小伙伴们一起留言打卡

坚持就是胜利,我们一起努力!

题目描述(引自LeetCode)

给定一个只包含数字的字符串,复原它并返回所有可能的IP地址格式。

有效的IP地址正好由四个整数(每个整数位于0到255之间组成),整数之间用'.'分隔。

示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]

题目分析

这是一道典型的回溯法的题目,值得注意的是,IP地址是有最长位数限制的。另外,为了提升执行速度,需要加入一些剪枝判断。总体来说,这是一道细节相对比较复杂的回溯法的题目。话不多说,上代码!

代码实现

class Solution {


    private List result = new ArrayList<>();
    private char[] tmp;


    public List restoreIpAddresses(String s) {
        tmp = new char[s.length() + 3];
        backtrace(s, 0, 0);
        return result;
    }


    private void backtrace(String s, int start, int step) {
        int n = s.length();
        if (n - start < 4 - step || n - start > (4 - step) * 3) return;
        if (step == 4) {
            result.add(new String(tmp));
            return;
        }
        if (step > 0) tmp[start + step - 1] = '.';
        tmp[start + step] = s.charAt(start);
        backtrace(s, start + 1, step + 1);
        if (s.charAt(start) == '0' || start >= n - 1) return;
        tmp[start + step + 1] = s.charAt(start + 1);
        backtrace(s, start + 2, step + 1);
        if (start + 2 >= n) return;
        tmp[start + step + 2] = s.charAt(start + 2);
        if ((s.charAt(start) - '0') * 100 + (s.charAt(start + 1) - '0') * 10 + s.charAt(start + 2) - '0' <= 255) {
            backtrace(s, start + 3, step + 1);
        }
    }


}

代码分析

对代码进行分析,回溯法的时间复杂度为指数级别,但实际上由于符合要求的字符串是有长度限制的,因此在剪枝之后,可以近似认为是常数级别的时间复杂度。在此基础上,空间复杂度也是常数级别的。

执行结果

每日一题——复原IP地址_第1张图片

学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

你可能感兴趣的:(算法)