93. 复原IP地址
查看题目中等
字符串
排序
高频
解法一:回溯
时间复杂度:O(3^4) | 空间复杂度:O(4) | 推荐使用
动画演示
复原IP地址 - 回溯算法
回溯过程可视化
当前路径:
?
字符串分割:
2
5
5
2
5
5
1
1
1
3
5
当前分割位置:0
有效性验证:
当前段无效
有效IP地址:
操作日志
代码实现
class Solution {
public List<String> restoreIpAddresses(String s) {
List<String> result = new ArrayList<>();
backtrack(s, 0, new ArrayList<>(), result);
return result;
}
private void backtrack(String s, int start, List<String> path, List<String> result) {
// 终止条件:已经分割成4段且遍历完整个字符串
if (path.size() == 4) {
if (start == s.length()) {
result.add(String.join(".", path));
}
return;
}
// 遍历可能的分割位置
for (int i = 1; i <= 3; i++) {
// 超出字符串长度,终止循环
if (start + i > s.length()) {
break;
}
// 分割出当前段
String segment = s.substring(start, start + i);
// 检查当前段是否有效
if (isValidSegment(segment)) {
// 选择当前段
path.add(segment);
// 递归处理剩余部分
backtrack(s, start + i, path, result);
// 回溯,移除当前段
path.remove(path.size() - 1);
}
}
}
private boolean isValidSegment(String segment) {
// 长度为1-3
if (segment.length() == 0 || segment.length() > 3) {
return false;
}
// 不能有前导零,除非是单个零
if (segment.length() > 1 && segment.charAt(0) == '0') {
return false;
}
// 数值在0-255之间
int num = Integer.parseInt(segment);
return num >= 0 && num <= 255;
}
}时间复杂度:O(3^4)
空间复杂度:O(4)