🚀 算法题 🚀 |
🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯
🚀 算法题 🚀 |
🚩 题目链接
⛲ 题目描述
有效 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+2
cnt--; // 回溯
s = sb.deleteCharAt(i + 1).toString(); // 回溯删掉逗点
} else
break; // 不合法,直接结束本层循环
}
}
// 判断字符串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;
}
}
🥦 运行结果
💬 共勉
最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |