• LeetCode 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. class Solution {
    2. static final int SEG_COUNT = 4;
    3. List ans = new ArrayList();
    4. int[] segments = new int[SEG_COUNT];
    5. public List restoreIpAddresses(String s) {
    6. segments = new int[SEG_COUNT];
    7. dfs(s, 0, 0);
    8. return ans;
    9. }
    10. public void dfs(String s, int segId, int segStart) {
    11. // 如果找到了 4 段 IP 地址并且遍历完了字符串,那么就是一种答案
    12. if (segId == SEG_COUNT) {
    13. if (segStart == s.length()) {
    14. StringBuffer ipAddr = new StringBuffer();
    15. for (int i = 0; i < SEG_COUNT; ++i) {
    16. ipAddr.append(segments[i]);
    17. if (i != SEG_COUNT - 1) {
    18. ipAddr.append('.');
    19. }
    20. }
    21. ans.add(ipAddr.toString());
    22. }
    23. return;
    24. }
    25. // 如果还没有找到 4 段 IP 地址就已经遍历完了字符串,那么提前回溯
    26. if (segStart == s.length()) {
    27. return;
    28. }
    29. // 由于不能有前导零,如果当前数字为 0,那么这一段 IP 地址只能为 0
    30. if (s.charAt(segStart) == '0') {
    31. segments[segId] = 0;
    32. dfs(s, segId + 1, segStart + 1);
    33. }
    34. // 一般情况,枚举每一种可能性并递归
    35. int addr = 0;
    36. for (int segEnd = segStart; segEnd < s.length(); ++segEnd) {
    37. addr = addr * 10 + (s.charAt(segEnd) - '0');
    38. if (addr > 0 && addr <= 0xFF) {
    39. segments[segId] = addr;
    40. dfs(s, segId + 1, segEnd + 1);
    41. } else {
    42. break;
    43. }
    44. }
    45. }
    46. }
  • 相关阅读:
    httprunner3.x总结23 - 解决批量执行中重复登陆的问题
    python贪心算法——以“修理牛棚”题目为例
    WebWall-05.SQL-Inject(SQL注入漏洞)
    【jvm源码】-2.对象核心源码
    高云FPGA系列教程(10):letter-shell串口终端移植
    论文阅读(一)城市干道分段绿波协调控制模型研究
    【Linux】详细介绍Linux重入不可重入带例子
    Word控件Spire.Doc 【文档操作】教程(二):在 C#、VB.NET 中打开 Word
    Spring Framework 6.0 框架
    Makefile--自动识别编译环境(x86还是arm)进行编译
  • 原文地址:https://blog.csdn.net/weixin_62275996/article/details/126144483