当前位置:网站首页>复原IP地址[标准回溯+标准剪枝]
复原IP地址[标准回溯+标准剪枝]
2022-06-23 22:18:00 【REN_林森】
前言
复原IP地址,标准的回溯搜索,由于IP地址的限定,标准的剪枝练习。
一、复原IP地址

二、回溯搜索+多剪枝+常见bug
package everyday.medium;
import java.util.LinkedList;
import java.util.List;
// 复原IP地址
public class RestoreIpAddresses {
/* target:给一个字符串s,拆分成4块,看是否是合法的IP地址。 合法IP地址:1:0-255;2:只有4份数;3:除了0没有前导为0的数. */
public List<String> restoreIpAddresses(String s) {
List<String> ans = new LinkedList<>();
StringBuilder sb = new StringBuilder();
// 枚举 填充符合条件的IP
dfs(s, 0, 0, sb, ans);
// 返回填充好的列表
return ans;
}
private void dfs(String s, int cur, int n, StringBuilder sb, List<String> ans) {
if (n == 4 && cur == s.length()) {
// 能到这里,都是符合条件的IP地址。
sb.deleteCharAt(sb.length() - 1);
ans.add(new String(sb));
// bug2:把 . 删除了,添加之后又不加上去,回溯时会出现删多的情况。
sb.append('.');
return;
}
// 如果数字还没用完,而已经分了四份了,剪枝;如果没到4份,但是数字已经没用,剪枝。
if (n == 4 || cur == s.length()) return;
// 如果 s.length() - (4 - n) * 4 > 0时,绝不可能形成IP,剪枝。
// bug1:s.length()永远不变,所以会有>0提前return的情况,应该是s.length() - cur - 1
if (s.length() - cur - 1 - (4 - n) * 4 > 0) return;
// 标准回溯
for (int i = 0; i < 3 && i + cur < s.length(); i++) {
// IP 长度小于3位,剪枝。
// 前导为0,那只能是0.
if (i == 0 && s.charAt(cur) == '0') {
sb.append("0.");
dfs(s, cur + 1, n + 1, sb, ans);
sb.delete(sb.length() - 2, sb.length());
break;
}
// 前导非0
String str = s.substring(cur, cur + i + 1);
int len = str.length();
int val = Integer.parseInt(str);
if (val <= 255) {
sb.append(val).append('.');
dfs(s, cur + i + 1, n + 1, sb, ans);
sb.delete(sb.length() - len - 1, sb.length());
}
}
}
public static void main(String[] args) {
new RestoreIpAddresses().restoreIpAddresses("25525511135");
}
}
总结
1)回溯搜索 + 标准剪枝 + 常见回溯bug
参考文献
[1] LeetCode 复原IP地址
边栏推荐
猜你喜欢

高仿书旗小说 Flutter 版,学起来

Sorry, your USB cable may be wrong!

2022 Shandong Health Expo, Jinan International Health Industry Expo, China Nutrition and Health Exhibition

Postman return value Chinese garbled????

接私活必备的 6 个开源项目

APP性能优化之启动流程分析

laravel之任务队列

格林公式挖洞法中内曲线顺时针的直观解释

List<? extends T>和List<?super T>区别

Solve the problem that slf4j logs are not printed
随机推荐
Sorry, your USB cable may be wrong!
三维向量场中的通量
2022 point de connaissance de l'examen des ingénieurs en sécurité de l'information: contrôle d'accès
Autofac详解
网站ssl证书
PyQt5_ Qtablewidget paging radio right-click menu control
泰勒公式及常用展开
2022山东健博会,济南国际大健康产业博览会,中国营养健康展
STM32 ------ external interrupt
Digital property management has become a trend. How can traditional property companies achieve digital butterfly change through transformation?
图扑软件智慧风电:数字孪生 3D 风机智能设备运维
为实现“双碳”目标,应如何实现节能、合理的照明管控
【HackTheBox】Fawn
Idea automatically generates unit tests, doubling efficiency!
PyQt5_QTableWidget分页单选右键菜单控件
如何保证高速公路供电可靠
Thinking (87): Protocol encryption and compression
Solve the problem that slf4j logs are not printed
产线工控安全有什么好的解决方案
一个人竟然撸了一个微博 APP