本文主要是介绍【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 仅由数字组成
🌟 求解思路&实现代码&运行结果
⚡ 递归
🥦 求解思路
- 该题目需要收集满足要求的ip地址串,我们通过dfs来实现,dfs(index,s,cnt):递归函数表示从index位置开始,此时收集的合法字符串是是,已经收集了cnt段。
- 具体的求解算法思路都注释到了代码中,请直接参考实现代码。
- 有了基本的思路,接下来我们就来通过代码来实现一下的解法。
🥦 实现代码
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;}
}
🥦 运行结果
💬 共勉
最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |
这篇关于【Leetcode:93. 复原 IP 地址 + dfs】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!