码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 93. 复原 IP 地址


    题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

    解题思路:递归+回溯

    IP地址一共有四个整数组成,每次递归找出一个有效的整数,当选择4个整数,并且字符串s也已经达到末尾,即找到一个有效的IP地址。

    1. 全局变量:
      1. List result:用于保存所有的有效IP地址
      2. List tem:用于保存每一部分的整数
    2. 函数定义:process(String s, int index),从s[index]位置开始寻找一个有效的整数
      1. 递归终止条件:
        1. 如果index>=s.length() && tem.size()==4:则已经找到4个有效的整数,将tem里的字符串拼接程有效的IP地址,return
        2. 如果index>=s || tem.size()==4:即字符串s已经使用完,但是还没有找到4个有效的数字,或者s没有使用完,但是已经找到了4个有效的数字,此时,都直接return
      2. 每个有效数字可以是0-255之间的数字,所以选择截取1个,2个或者3个字符,判断截取的字符是否是一个有效的整数,所以使用循环进行截取这三种情况:
        1. 如果s[index] == '0',则只能截取1个字符:
          1. tem.add("0")
          2. process(s, index+1)
          3. tem.remove(tem.size()-1):回溯
          4. break:直接跳出循环,因为当前字符为0,只能截取1个字符
        2. 否则:如果截取的字符组成的数组小于等于255,则其是一个有效的整数:
          1. tem.add(part):part是截取的字符
          2. process(s, index+1)
          3. tem.remove(tem.size()-1):回溯

    如果s的长度小于4或者大于12,一定不能组合成一个有效的IP,直接返回空列表

    AC代码:

    1. class Solution {
    2. public List result;
    3. public List tem;
    4. public List restoreIpAddresses(String s) {
    5. result = new ArrayList<>();
    6. tem = new ArrayList<>();
    7. if (s.length() < 4 || s.length() > 12) {
    8. return result;
    9. }
    10. process(s, 0);
    11. return result;
    12. }
    13. public void process(String s, int index) {
    14. if (index >= s.length() && tem.size() == 4) {
    15. StringBuilder ans = new StringBuilder();
    16. for (int i = 0; i < tem.size(); i++) {
    17. if (i==0){
    18. ans.append(tem.get(i));
    19. }else {
    20. ans.append(".").append(tem.get(i));
    21. }
    22. }
    23. result.add(ans.toString());
    24. return;
    25. } else if (index >= s.length()||tem.size()==4) {
    26. return;
    27. }
    28. for (int i = 1; i <= 3; i++) {
    29. if (index + i > s.length()) {
    30. break;
    31. }
    32. String part = s.substring(index, index + i);
    33. if (s.charAt(index) == '0') {
    34. tem.add("0");
    35. process(s, index + 1);
    36. tem.remove(tem.size() - 1);
    37. break;
    38. } else if (part.length() <= 2 || part.compareTo("255") <= 0) {
    39. tem.add(part);
    40. process(s, index + i);
    41. tem.remove(tem.size() - 1);
    42. }
    43. }
    44. }
    45. }

  • 相关阅读:
    中山大学软件工程学院区块链课程作业——信息传递网络与价值传递网络的区别和联系是什么?未来价值传递网络上可能产生的新业务有哪些?
    计算模型参数量
    计算机网络之物理层
    【软考】5.1 七层模型/局域网/TCP-IP协议
    手把手带你用Python和文心一言搭建《AI看图写诗》网页项目(附上完整项目源码)
    java计算机毕业设计小型企业财务报销管理源码+系统+数据库+lw文档+mybatis+运行部署
    jackson的@JsonIgnore注解和@JsonFormat注解混用导致不生效问题
    【uni-app】响应式单位rpx
    近日找实习总结
    Mybatis-lean
  • 原文地址:https://blog.csdn.net/qq_40707370/article/details/133844977
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号