LeetCode 93
https://leetcode.cn/problems/restore-ip-addresses/description/
难度:中等
子集型回溯题目,本题使用“枚举选哪个”方法。
dfs(i, start) i 表示第几段,start 表示这一段从第几个数字开始。当选够 4 段且所有数字都被使用时添加答案。
如果 s[start] 为 0,这一段只能是 0,dfs(i + 1, start + 1)。
如果不是 0,这一段的数据范围需要在 [1, 255]之间,如果超过 255 就 break。
时间复杂度:\(O(3^N \times m)\),m 为 s 的长度。
空间复杂度:O(N)
class Solution {
public:
static constexpr int N = 4;
vector<string> restoreIpAddresses(string s) {
vector<string> ans;
vector<int> path(N);
auto dfs = [&](auto&& dfs, int i, int start) {
if (i == N) {
if (start == s.size()) {
string ip = "";
for (int i = 0; i < N; i++) {
ip += to_string(path[i]);
if (i != N - 1) {
ip += ".";
}
}
ans.emplace_back(ip);
}
return;
}
if (start == s.size()) {
return;
}
if (s[start] == '0') {
path[i] = 0;
dfs(dfs, i + 1, start + 1);
} else {
int addr = 0;
for (int j = start; j < s.size(); j++) {
addr = addr * 10 + (s[j] - '0');
if (addr > 0 && addr <= 255) {
path[i] = addr;
dfs(dfs, i + 1, j + 1);
} else {
break;
}
}
}
};
dfs(dfs, 0, 0);
return ans;
}
};