LeetCode 93. Restore IP Addresses

LeetCode 93. Restore IP Addresses (复原 IP 地址)

题目

链接

https://leetcode.cn/problems/restore-ip-addresses/

问题描述

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

例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

示例

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

提示

1 <= s.length <= 20
s 仅由数字组成

思路

回溯加剪枝,如果当前选取的不对,就没必要继续往后了,直接return即可。

复杂度分析

时间复杂度 O(n2)
空间复杂度 O(n)

代码

Java

    LinkedList<String> path = new LinkedList<>();
    List<String> ans = new LinkedList<>();

    public List<String> restoreIpAddresses(String s) {
        trace(s, 0);
        return ans;
    }

    public void trace(String s, int index) {
        if (index == s.length() && path.size() == 4) {
            String tmp = path.get(0) + "." + path.get(1) + "." + path.get(2) + "." + path.get(3);
            ans.add(tmp);
            return;
        }
        for (int i = index + 1; i <= s.length(); i++) {
            String tmp = s.substring(index, i);
            if (test(tmp)) {
                path.add(tmp);
                trace(s, i);
                path.removeLast();
            } else {
                return;
            }
        }
    }

    public boolean test(String s) {
        if (s.length() == 0) {
            return false;
        }
        if (s.charAt(0) == '0' && !s.equals("0")) {
            return false;
        }
        int num = Integer.valueOf(s);
        if (num < 0 || num > 255) {
            return false;
        }
        return true;
    }
posted @ 2022-06-14 16:36  cheng102e  阅读(17)  评论(0编辑  收藏  举报