菜鸡每日一题系列打卡93天
每天一道算法题目
小伙伴们一起留言打卡
坚持就是胜利,我们一起努力!
题目描述(引自LeetCode)
给定一个只包含数字的字符串,复原它并返回所有可能的IP地址格式。
有效的IP地址正好由四个整数(每个整数位于0到255之间组成),整数之间用'.'分隔。
示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
题目分析
这是一道典型的回溯法的题目,值得注意的是,IP地址是有最长位数限制的。另外,为了提升执行速度,需要加入一些剪枝判断。总体来说,这是一道细节相对比较复杂的回溯法的题目。话不多说,上代码!
代码实现
class Solution {
private List<String> result = new ArrayList<>();
private char[] tmp;
public List<String> restoreIpAddresses(String s) {
tmp = new char[s.length() + 3];
backtrace(s, 0, 0);
return result;
}
private void backtrace(String s, int start, int step) {
int n = s.length();
if (n - start < 4 - step || n - start > (4 - step) * 3) return;
if (step == 4) {
result.add(new String(tmp));
return;
}
if (step > 0) tmp[start + step - 1] = '.';
tmp[start + step] = s.charAt(start);
backtrace(s, start + 1, step + 1);
if (s.charAt(start) == '0' || start >= n - 1) return;
tmp[start + step + 1] = s.charAt(start + 1);
backtrace(s, start + 2, step + 1);
if (start + 2 >= n) return;
tmp[start + step + 2] = s.charAt(start + 2);
if ((s.charAt(start) - '0') * 100 + (s.charAt(start + 1) - '0') * 10 + s.charAt(start + 2) - '0' <= 255) {
backtrace(s, start + 3, step + 1);
}
}
}
代码分析
对代码进行分析,回溯法的时间复杂度为指数级别,但实际上由于符合要求的字符串是有长度限制的,因此在剪枝之后,可以近似认为是常数级别的时间复杂度。在此基础上,空间复杂度也是常数级别的。
执行结果
学习 | 工作 | 分享
????长按关注“有理想的菜鸡”
只有你想不到,没有你学不到