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

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

注:仅供学习参考

题目来源:力扣.

93. 复原 IP 地址相关推荐

  1. leetcode:491. 递增子序列、17. 电话号码的字母组合、31. 分割回文串、93. 复原 IP 地址(JavaScript)

    文章目录 491. 递增子序列 分析 去重 如何保证递增呢? 17. 电话号码的字母组合 思路: 单层递归逻辑 递归终止条件 完整代码 另一种写法 31. 分割回文串 思路:分析题目本题可分为两步 9 ...

  2. LeetCode 93. 复原 IP 地址【字符串,回溯算法】

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

  3. leetcode系列-93.复原 IP 地址

    leetcode系列–第93题.复原 IP 地址 题目描述:有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔.例如:" ...

  4. leetcode 93. 复原IP地址 思考分析

    题目 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255之间组成,且不能含有前导 0),整数之间用 '.' 分隔. ...

  5. LeetCode 93. 复原IP地址(回溯)

    1. 题目 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135&q ...

  6. 多看看把,条件太多了--leetcode 93. 复原 IP 地址

    难度:中等 频次:62 题目: 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔. 例如:"0.1.2.201&quo ...

  7. 142. Leetcode 93. 复原 IP 地址 (回溯算法-切割问题)

    分析剪枝条件: 1.一开始,字符串的长度小于 4 或者大于 12 ,一定不能拼凑出合法的 ip 地址(这一点可以一般化到中间结点的判断中,以产生剪枝行为); 2.每一个结点可以选择截取的方法只有 3 ...

  8. 93. 复原 IP 地址(回溯算法)

    给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 .你可以按任何顺序返回答案. 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组 ...

  9. 力扣93 - 复原IP地址【回溯算法】

    回溯算法解决字符串分割问题 一.题目分析 题目描述 思路分析 二.代码的细究与详解 回溯三部曲 三.相似题目 四.总结与提炼 一.题目分析 原题链接 题目描述 有效 IP 地址 正好由四个整数(每个整 ...

最新文章

  1. Mycat实现读写分离
  2. Oracle架构实现原理、含五大进程解析(图文详解)
  3. java读书心得_Java读书笔记 20100815
  4. [BZOJ1130] [POI2008]POD Subdivision of Kingdom
  5. Django:视图和URL配置
  6. Go语言 命令行解析(一)
  7. javaserver_什么是JavaServer Faces(JSF)
  8. python+selenium,实现带有验证码的自动化登录功能
  9. 杭电 1242题(深度优先搜索)
  10. excel2010服务器打开闪退
  11. android桌面半透明,Android仿Iphone屏幕底部弹出半透明PopupWindow效果
  12. Office安装时闪退,用Windows Installer Cleanup彻底卸载 或 注册表清理解决
  13. EXCEL实现自动填充
  14. 2018年春季学期《软件工程》班级讨论群中开放性问题群聊记录
  15. 用双重for循环打印正三角形和倒三角形的思路
  16. 基于Python的招聘信息可视化分析研究
  17. Java中正负数二进制表示
  18. break和continue用法
  19. Deep Knowledge Tracking based on Attention Mechanism for Student Performance Prediction
  20. 消防人员实操训练模拟培训虚拟仿真实训系统软件

热门文章

  1. DaVinci:调色版本
  2. 家长心态建设;一切都没想象的那么糟
  3. 哈佛结构/冯诺依曼结构详细分析
  4. 发国外邮件用什么企业邮箱?在国外用什么邮箱稳定呢?
  5. node.js使用手册_权威的Node.js手册
  6. ma5671怎么设置_华为MA5671怎样设置POE供电
  7. 全月加权平均的计算(分仓核算,结果反填到单据)
  8. 锐捷睿易:扩大DHCP掩码导致AP不上线问题
  9. 爬取NBA球员生涯数据,并在Excel中可视化显示
  10. PR放入视频音频后没声音,及提示MME设备内部错误的解决办法