【问题描述】[中等]

【解答思路】

1. 递归 回溯剪枝

复杂度

class Solution {static final int SEG_COUNT = 4;List<String> ans = new ArrayList<String>();int[] segments = new int[SEG_COUNT];public List<String> restoreIpAddresses(String s) {segments = new int[SEG_COUNT];dfs(s, 0, 0);return ans;}public void dfs(String s, int segId, int segStart) {// 如果找到了 4 段 IP 地址并且遍历完了字符串,那么就是一种答案if (segId == SEG_COUNT) {if (segStart == s.length()) {StringBuffer ipAddr = new StringBuffer();for (int i = 0; i < SEG_COUNT; ++i) {ipAddr.append(segments[i]);if (i != SEG_COUNT - 1) {ipAddr.append('.');}}ans.add(ipAddr.toString());}return;}// 如果还没有找到 4 段 IP 地址就已经遍历完了字符串,那么提前回溯 剪枝 if (segStart == s.length()) {return;}// 由于不能有前导零,如果当前数字为 0,那么这一段 IP 地址只能为 0 条件 if (s.charAt(segStart) == '0') {segments[segId] = 0;dfs(s, segId + 1, segStart + 1);}// 一般情况,枚举每一种可能性并递归 int addr = 0;for (int segEnd = segStart; segEnd < s.length(); ++segEnd) {addr = addr * 10 + (s.charAt(segEnd) - '0');if (addr > 0 && addr <= 0xFF) {segments[segId] = addr;dfs(s, segId + 1, segEnd + 1);} else {break;}}}
}
2. 三重循环暴力遍历
  1. i、j、j分别表征分隔点的位置,比如255|255|255|255,i,j,k分别为2、5、8;
  2. 分割成子字符串,并且转换成数字;
  3. 判断是否合理:1)数字是否小于等于255,2)连续0的个数只能为1 && 非0数字不能以0开头
import java.util.*;class lc93 {static List<String> res = new ArrayList<>();public List<String> restoreIpAddresses(String s) {int len = s.length();if (len > 12) return res;for (int i = 0; i < len - 3; i++) {int num1 = Integer.parseInt(s.substring(0, i + 1));if (num1 > 255 || getLen(num1) != i + 1) continue;for (int j = i + 1; j < len - 2; j++) {int num2 = Integer.parseInt(s.substring(i + 1, j + 1));if (num2 > 255 || getLen(num2) != j - i) continue;for (int k = j + 1; k < len - 1; k++) {int num3 = Integer.parseInt(s.substring(j + 1, k + 1));if (num3 > 255 || getLen(num3) != k - j) continue;int num4 = Integer.parseInt(s.substring(k + 1, len));if (num4 > 255 || getLen(num4) != len - k - 1) continue;String temp = num1 + "." + num2 + "." + num3 + "." + num4;res.add(temp);}}}return res;}int getLen(int num) {if (num == 0)return 1;
//num =100,  Math.log(num) / Math.log(10) =2return (int) (Math.log(num) / Math.log(10)) + 1;//位数}
}

【总结】

1. 全排列回溯法模板回顾
if 满足结束条件:result.add(路径)return
for 选择 in 选择列表:#排除不合法的选择d将该选择从选择列表移除(used数组 /条件限制)# 做选择路径.add(选择)backtrack(路径, 选择列表)# 撤销选择路径.remove(选择)
2.回溯剪枝 定义出口 剪枝(排除条件+特有情况 ) 一般情况
  • 定义出口 if (segId == SEG_COUNT)

  • 剪枝(排除条件+特有情况 )

  1. if (segStart == s.length()) //提前终止
  2. if (s.charAt(segStart) == ‘0’) // 由于不能有前导零,如果当前数字为 0,那么这一段 IP 地址只能为 0
  • 一般情况 枚举每一种可能性并递归 做选择
3. First make it work, then make it right, and, finally, make it fast.

首先使其正常运行,然后使其正确,最后使其快速。

先写暴力,然后再优化。

转载链接:https://leetcode-cn.com/problems/restore-ip-addresses/solution/fu-yuan-ipdi-zhi-by-leetcode-solution/

参考链接:https://leetcode-cn.com/problems/restore-ip-addresses/solution/hui-su-suan-fa-hua-tu-fen-xi-jian-zhi-tiao-jian-by/

[Leetcode][第93题][JAVA][复原IP地址][剪枝][回溯]相关推荐

  1. LeetCode 第 93 题:复原IP地址(C++)

    93. 复原IP地址 - 力扣(LeetCode) 最开始的思路是对字符串进行三次切割,每次从左边切一块下来(最多切3位数). 那么我们现在有三个切割点(下标) i, j, k,它们应该满足: n=s ...

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

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

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

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

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

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

  5. leetcode93. 复原IP地址(回溯)

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

  6. [Leetcode][第60题][JAVA][第k个排列][回溯][DFS][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯搜索算法 + 剪枝 ,直接来到叶子结点 时间复杂度:O(N^2) 空间复杂度:O(N) import java.util.Arrays;public cl ...

  7. [Leetcode][第78题][JAVA][子集][位运算][回溯]

    [问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...

  8. [Leetcode][第17题][JAVA][电话号码的字母组合][回溯]

    [问题描述][中等] [解答思路] 用哈希表/数组存储每个数字对应的所有可能的字母,然后进行回溯操作. 回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是 ...

  9. [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]

    [问题描述][中等] [解答思路] 1. DFS繁琐版本 class Solution {public boolean exist(char[][] board, String word) {bool ...

最新文章

  1. java 获取聚合vo_NC57聚合VO写法
  2. python【蓝桥杯vip练习题库】ADV-281特等奖学金
  3. Linux编程之定制带级别的log
  4. ActionScript 3.0 优化
  5. Tencent Blade team荣获小米安全年度最佳守护者
  6. 快速打开Github某个commit页面的方法
  7. ado.not--练习题
  8. python大作业报告(爬虫 分析 可视化)_python第四次周末大作业
  9. 一个js内存泄露的好例子
  10. 网络编程_8(项目附件)
  11. 同一个交换机组建局域网
  12. Opencv访问图像像素的三种方法
  13. java蓝牙程序怎么调试_蓝牙BLE调试助手软件源码
  14. android 背景图缩放,android背景图按比例缩放方法
  15. SQL Server日期时间字符串的处理和转换
  16. Java并发包:ExecutorService和ThreadPoolExecutor
  17. 剑指offer_4 二叉树遍历
  18. proxy chains 配置
  19. 吐血整理:人工智能、机器学习领域13个常见概念
  20. qq炫舞显示服务器断开,快速还原win7系统玩QQ炫舞老是掉线提示与服务器断开连接的处理次序...

热门文章

  1. C# 依据KeyEventArgs与组合键字符串相互转换
  2. linux安装mongodb(设置非root用户和开机启动)
  3. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
  4. 总结css中单位px和em,rem的区别
  5. ASP.NET生成WORD文档服务器部署注意事项
  6. You get a dream...you gotta protect it.
  7. WinAPI: midiOutGetID - 获取输出设备 ID
  8. 3、Finished with error: FormatException: Bad UTF-8 encoding 0xc3 (at offset 169)
  9. exposed beyond app through Intent.getData(),或FileUriExposedException
  10. 未获取root手机抓包方法