[Leetcode][第93题][JAVA][复原IP地址][剪枝][回溯]
【问题描述】[中等]
【解答思路】
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. 三重循环暴力遍历
- i、j、j分别表征分隔点的位置,比如255|255|255|255,i,j,k分别为2、5、8;
- 分割成子字符串,并且转换成数字;
- 判断是否合理: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)
剪枝(排除条件+特有情况 )
- if (segStart == s.length()) //提前终止
- 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地址][剪枝][回溯]相关推荐
- LeetCode 第 93 题:复原IP地址(C++)
93. 复原IP地址 - 力扣(LeetCode) 最开始的思路是对字符串进行三次切割,每次从左边切一块下来(最多切3位数). 那么我们现在有三个切割点(下标) i, j, k,它们应该满足: n=s ...
- LeetCode 93. 复原IP地址(回溯)
1. 题目 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135&q ...
- 力扣93 - 复原IP地址【回溯算法】
回溯算法解决字符串分割问题 一.题目分析 题目描述 思路分析 二.代码的细究与详解 回溯三部曲 三.相似题目 四.总结与提炼 一.题目分析 原题链接 题目描述 有效 IP 地址 正好由四个整数(每个整 ...
- 93. 复原 IP 地址(回溯算法)
给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 .你可以按任何顺序返回答案. 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组 ...
- leetcode93. 复原IP地址(回溯)
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 '.' 分隔. 示例: 输入: " ...
- [Leetcode][第60题][JAVA][第k个排列][回溯][DFS][剪枝]
[问题描述][中等] [解答思路] 1. 回溯搜索算法 + 剪枝 ,直接来到叶子结点 时间复杂度:O(N^2) 空间复杂度:O(N) import java.util.Arrays;public cl ...
- [Leetcode][第78题][JAVA][子集][位运算][回溯]
[问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...
- [Leetcode][第17题][JAVA][电话号码的字母组合][回溯]
[问题描述][中等] [解答思路] 用哈希表/数组存储每个数字对应的所有可能的字母,然后进行回溯操作. 回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是 ...
- [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]
[问题描述][中等] [解答思路] 1. DFS繁琐版本 class Solution {public boolean exist(char[][] board, String word) {bool ...
最新文章
- java 获取聚合vo_NC57聚合VO写法
- python【蓝桥杯vip练习题库】ADV-281特等奖学金
- Linux编程之定制带级别的log
- ActionScript 3.0 优化
- Tencent Blade team荣获小米安全年度最佳守护者
- 快速打开Github某个commit页面的方法
- ado.not--练习题
- python大作业报告(爬虫 分析 可视化)_python第四次周末大作业
- 一个js内存泄露的好例子
- 网络编程_8(项目附件)
- 同一个交换机组建局域网
- Opencv访问图像像素的三种方法
- java蓝牙程序怎么调试_蓝牙BLE调试助手软件源码
- android 背景图缩放,android背景图按比例缩放方法
- SQL Server日期时间字符串的处理和转换
- Java并发包:ExecutorService和ThreadPoolExecutor
- 剑指offer_4 二叉树遍历
- proxy chains 配置
- 吐血整理:人工智能、机器学习领域13个常见概念
- qq炫舞显示服务器断开,快速还原win7系统玩QQ炫舞老是掉线提示与服务器断开连接的处理次序...
热门文章
- C# 依据KeyEventArgs与组合键字符串相互转换
- linux安装mongodb(设置非root用户和开机启动)
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
- 总结css中单位px和em,rem的区别
- ASP.NET生成WORD文档服务器部署注意事项
- You get a dream...you gotta protect it.
- WinAPI: midiOutGetID - 获取输出设备 ID
- 3、Finished with error: FormatException: Bad UTF-8 encoding 0xc3 (at offset 169)
- exposed beyond app through Intent.getData(),或FileUriExposedException
- 未获取root手机抓包方法