当前位置: 首页 > news >正文

【Leetcode:93. 复原 IP 地址 + dfs】

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述
在这里插入图片描述

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 递归
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚩 题目链接

  • 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 <= s.length <= 20
s 仅由数字组成

🌟 求解思路&实现代码&运行结果


⚡ 递归

🥦 求解思路
  1. 该题目需要收集满足要求的ip地址串,我们通过dfs来实现,dfs(index,s,cnt):递归函数表示从index位置开始,此时收集的合法字符串是是,已经收集了cnt段。
  2. 具体的求解算法思路都注释到了代码中,请直接参考实现代码。
  3. 有了基本的思路,接下来我们就来通过代码来实现一下的解法。
🥦 实现代码
class Solution {List<String> temp = new ArrayList<>();public List<String> restoreIpAddresses(String s) {// 0-255 如果当前0开头,那么就不用考虑后面的要求了。process(0, s, 0);return temp;}public void process(int index, String s, int cnt) {if (cnt == 3) {// 判断第四段子字符串是否合法,如果合法就放进result中if (isValid(s, index, s.length() - 1)) {temp.add(s);}return;}for (int i = index; i < s.length(); i++) {if (isValid(s, index, i)) { // 判断 [startIndex,i] 这个区间的子串是否合法StringBuilder sb = new StringBuilder(s);s = sb.insert(i + 1, ".").toString(); // 在i的后面插入一个逗点cnt++;process(i + 2, s, cnt); // 插入逗点之后下一个子串的起始位置为i+2cnt--; // 回溯s = sb.deleteCharAt(i + 1).toString(); // 回溯删掉逗点} elsebreak; // 不合法,直接结束本层循环}}// 判断字符串s在左闭又闭区间[start, end]所组成的数字是否合法public boolean isValid(String s, int start, int end) {if (start > end) {return false;}if (s.charAt(start) == '0' && start != end) { // 0开头的数字不合法return false;}int num = 0;for (int i = start; i <= end; i++) {if (s.charAt(i) > '9' || s.charAt(i) < '0') { // 遇到非数字字符不合法return false;}num = num * 10 + (s.charAt(i) - '0');if (num > 255) { // 如果大于255了不合法return false;}}return true;}
}
🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述


http://www.mrgr.cn/news/2938.html

相关文章:

  • 帆软报表,达梦数据库驱动上传失败
  • 自然语言处理NLP四范式
  • ArrayList与顺序表
  • ADB使用报错的问题FileNotfoundError:[WinError 3]系统找不到指定的路径
  • 跟李沐学AI:目标检测的常用算法
  • 怎么在网络攻击中屹立不倒
  • 自闭症学校一年学费多少?
  • 网络协议(概念版)
  • 独家揭秘丨GreatSQL 的MDL锁策略升级对执行的影响
  • 深度学习(9)---ResNet详解
  • ant design 的 tree 如何作为角色中的权限选择之一
  • 【大模型】triton inference server
  • 仿Muduo库实现高并发服务器——任务定时器模块
  • 如何在Sui上进行质押
  • PXE-Kickstart高效批量装机
  • axios的使用
  • 玩机进阶教程-----回读 备份 导出分区来制作线刷包 回读分区的写入与否 修改xml脚本
  • Ubuntu无法解析域名DNS指向127.0.0.53问题处理
  • ctfshow之web29~web51
  • 【数据结构】七、查找:3.散列查找(哈希表)