题目描述
给定一个字符串,只包含数字。请解码出所有合法的IP地址。
样例
输入:"25525511135"
输出:["255.255.11.135", "255.255.111.35"]
算法
(暴力搜索) $O(C_{n-1}^3)$
直接暴力搜索出所有合法方案。
合法的IP地址由四个0到255的整数组成。我们直接枚举四个整数的位数,然后判断每个数的范围是否在0到255。
时间复杂度分析:一共 $n$ 个数字,$n-1$ 个数字间隔,相当于从 $n-1$ 个数字间隔中挑3个断点,所以计算量是 $O(C_{n-1}^3)$。
C++ 代码
class Solution {
public:
vector<string> ans;
vector<int> path;
vector<string> restoreIpAddresses(string s) {
dfs(0, 0, s);
return ans;
}
// u表示枚举到的字符串下标,k表示当前截断的IP个数,s表示原字符串
void dfs(int u, int k, string &s)
{
if (u == s.size())
{
if (k == 4)
{
string ip = to_string(path[0]);
for (int i = 1; i < 4; i ++ )
ip += '.' + to_string(path[i]);
ans.push_back(ip);
}
return;
}
if (k > 4) return;
unsigned t = 0;
for (int i = u; i < s.size(); i ++ )
{
t = t * 10 + s[i] - '0';
if (t >= 0 && t < 256)
{
path.push_back(t);
dfs(i + 1, k + 1, s);
path.pop_back();
}
if (!t) break;
}
}
};
可以剪枝优化吧,剩余长度/剩余段数>3时,就不需要继续下去了
可以的hh
根本不会,呜呜呜
我也是 呜呜呜
y总,怎么分析这个代码也 。写的时候边界条件感觉贼难想,还有dfs的位置和dfs和pushback的相对位置也贼难想,有时候在前边,有时候又在后边 难蚌
line : if (k > 4) return;
k==4也对 提前返回 虽然没什么d用 hhhh
闫总,为什么记录方案时间复杂度要乘多一个O(n)? 方案不是边搜边记的吗?不明白为啥记录方案复杂度不一样了
这里能用动态规划嘛?有子问题嘛?
y老师,为什么这里dfs不用回溯?
有回溯和恢复现场的。
请问一下最后一行 if(!t) break是什么意思 t等于0不是在上面的if语句判断过了吗
去掉这条语句 发现结果有重复 这句是怎么去重的呢
这里和重复没有关系。这句话是特判掉这种情况:IP地址中某个数字是
00, 01, 0023
这种有前导零的数,这类数都是不合法的。视频中的去除前导0很好理解。视频中的代码不通过是因为前导0的判断方法不一样导致的吗?
这里是直接排除掉了第一个选0的情况
这个代码已经不能通过了,hhh
已改hh
已改hh
十分谢谢lz的答案!
想说一下,lz之后的代码,方不方便把u k t 都换成更能表达实际意义的变量名称呢,这样子代码会通俗易懂很多啦,十分感谢!!
为了便于理解,在代码中加上了注释
哦哦不好意思。。。我当时可能刷的脑子已经麻木了。。。。。没看到。。soryy
没有没有hh,我是刚刚加上的注释^^