93. 复原 IP 地址
admin
2024-03-03 00:31:34
0

93. 复原 IP 地址

有效 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 中的任何数字。你可以按 任何 顺序返回答案。

示例 1:

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

示例 2:

输入:s = “0000”
输出:[“0.0.0.0”]

示例 3:

输入:s = “101023”
输出:[“1.0.10.23”,“1.0.102.3”,“10.1.0.23”,“10.10.2.3”,“101.0.2.3”]

提示:

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

思路:(回溯)

回溯算法事实上就是在一个树形问题上做深度优先遍历,因此 首先需要把问题转换为树形问题

  1. 一开始,字符串的长度小于 4 或者大于 12 ,一定不能拼凑出合法的 ip 地址;
  2. 由于 ip 段最多就 4 个段,因此这棵三叉树最多 4 层,这个条件作为递归终止条件之一;
  3. 每一个结点可以选择截取的方法只有 3 种:截 1 位、截 2 位、截 3 位,因此每一个结点可以生长出的分支最多只有 3 条分支;
  4. 根据截取出来的字符串判断是否是合理的 ip 段
  5. 每一个结点表示了求解这个问题的不同阶段,需要的状态变量有:
    • k:已经分割出多少个 ip 段;
    • s:剩余字符串;
    • temAddress:记录从根结点到叶子结点的一个路径(回溯算法常规变量,是一个栈);
    • addresses:记录结果集的变量,常规变量。

代码:(Java)

import java.util.ArrayList;
import java.util.List;public class restore_IP {public static void main(String[] args) {// TODO 自动生成的方法存根String s = "101023";System.out.println(restoreIpAddresses(s));}public static List restoreIpAddresses(String s) {List addresses  = new ArrayList<>();if(s.length() < 4 || s.length() > 12) {return addresses;}doRestore(new StringBuilder(), addresses, s, 0);return addresses;}private static void doRestore(StringBuilder temAddress, List addresses, String s, int k) {// TODO 自动生成的方法存根if(k == 4 || s.length() == 0) {if(k == 4 && s.length() == 0) {addresses.add(temAddress.toString());}return;}for(int i = 0; i < s.length() && i <= 2; i++) {if(i != 0 && s.charAt(0) == '0') {break;}String part = s.substring(0, i + 1);if(Integer.valueOf(part) <= 255) {if(temAddress.length() != 0) {part = "." + part;}temAddress.append(part);doRestore(temAddress, addresses, s.substring(i + 1), k + 1);temAddress.delete(temAddress.length() - part.length(), temAddress.length());}}}
}

复杂度分析:

我们用 N=4 表示 IP 地址的段数。

  • 时间复杂度:O(3N×∣s∣)O(3^N×∣s∣)O(3N×∣s∣)。由于 IP 地址的每一段的位数不会超过 3,因此在递归的每一层,我们最多只会深入到下一层的 3 种情况。由于 N=4,对应着递归的最大层数,所以递归本身的时间复杂度为 O(3N)O(3^N)O(3N)。如果我们复原出了一种满足题目要求的 IP 地址,那么需要 O(∣s∣) 的时间将其加入答案数组中,因此总时间复杂度为 O(3N×∣s∣)O(3^N×∣s∣)O(3N×∣s∣)。

  • 空间复杂度:O(N),这里只计入除了用来存储答案以外的额外空间复杂度。递归使用的空间与递归的最大深度 N 成正比。并且在上面的代码中,我们只额外使用了长度为 N 的栈 存储已经搜索过的 IP 地址,因此空间复杂度为 O(N)。

注:仅供学习参考

题目来源:力扣.

相关内容

热门资讯

一个人七种性格的电视剧韩剧叫什... 一个人七种性格的电视剧韩剧叫什么kill me heal me
重庆4日游攻略及路线,大学生去... 重庆,这座位于中国西南部的山城,以其独特的地理风貌、丰富的历史文化、诱人的美食和热情好客的人民而闻名...
有没有看过藏海花的娃。为毛有两... 有没有看过藏海花的娃。为毛有两个版本啊?是叫陈雪寒……其实这都是在一个版本里的……陈雪寒哪里是藏海花...
去内蒙旅游攻略自驾游五日游自由... 大家好,我是小李,一个热爱旅行的自由职业者。这次,我终于如愿以偿地踏上了内蒙古这片神秘的土地,进行了...
再生缘 我的温柔暴君 虐吗?结... 再生缘 我的温柔暴君 虐吗?结局好吗?详细介绍一下!!比较虐,但是结局是好的。
刘谦魔术揭秘 刘谦魔术揭秘越全越好!呵呵.我相信这个问题.你是不会知道的.因为刘谦在春晚上所表演的魔术.真是无懈可...
孔宣修炼出了五色神光,他却为何... 孔宣修炼出了五色神光,他却为何打不过准提道人?因为准提道人是圣人,是和通天教主一个级别的,孔宣虽然很...
螳螂的简介 螳螂的简介急呀!!! 具体如下:学名螳螂,亦称刀螂,无脊椎动物,属肉食性昆虫。在古希腊,人们将螳螂视...
智慧运动场如何实现? 智慧运动场如何实现?智慧运动场馆从会员到收银到营销,到智能硬件系统,实现智能化,自动化就差不多是智慧...
老板与白干 老板与白干老板招聘了一个小伙,叫“白干”,商定基本工资1角钱。第一天工资为基本工资一次方,第二天为二...
芙蓉楼送辛渐这首诗表达离别之情... 芙蓉楼送辛渐这首诗表达离别之情以及洁身自好品质的诗句是哪两句?表现了诗人洁身自好的诗句是“洛阳亲友如...
龙凤胎是指一胎怀有一男一女吗? 龙凤胎是指一胎怀有一男一女吗?龙凤胎就是在双胞胎的基础上两个婴儿的性别一男一女,这种情况是狠喜人的。...
我想去学习正宗老北京冰糖葫芦做... 我想去学习正宗老北京冰糖葫芦做法,该去哪里学习?糖葫芦都一个味道,没什么正宗不正宗的
中央四套的《新上门女婿》晚上几... 中央四套的《新上门女婿》晚上几点播出?每晚7:15-8:007:15-8:00每天一集,很好看呢,很...
怎样改变一个人的心态和思想 怎样改变一个人的心态和思想一下子不好改,慢慢一点一点改了多看看书,提高自律能力
萨沙有什么的品质 萨沙有什么的品质人好,帅气~
歌词,红色的血液流淌,红色的故... 歌词,红色的血液流淌,红色的故事照亮辉煌歌词,红色的血液流淌,红色的故事照亮辉煌冕宁县歌。《红色希望...
有什么好讲的童话故事? 有什么好讲的童话故事?动作要很好编的安徒生的短一些的都挺好讲,只是注意选个喜剧结局的。
奥比岛“被诅咒的公主”之奥莉斯... 奥比岛“被诅咒的公主”之奥莉斯《挑战黑蜘蛛》1——3关通关诀窍是什么?可以先把外圈先围上,这样就出不...
怎么才能知道女孩喜欢我?怎么写... 怎么才能知道女孩喜欢我?怎么写求爱的情书?南方有嘉木,北方有相思。嘉木风可摧,相思不可断。》》》写在...