【LeetCode-93】复原 IP 地址
问题
给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。
有效 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 = "010010"
输出: ["0.10.0.10","0.100.1.0"]
解答
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
ans.resize(4);
dfs(s, 0, 0);
return res;
}
private:
vector<string> res;
vector<int> ans;
void dfs(string& s, int pos, int id) { // 最多4层递归
if (id == 4) {
if (pos == s.size()) {
string p;
for (auto& i : ans) p += to_string(i) + ".";
p.pop_back();
res.emplace_back(p);
}
return;
}
if (s[pos] == '0') { // 前导0
ans[id] = 0;
dfs(s, pos + 1, id + 1);
return;
}
int cur = 0;
for (int i = pos; i < s.size(); i++) {
cur = 10 * cur + s[i] - '0';
if (cur > 255) return;
ans[id] = cur;
dfs(s, i + 1, id + 1);
}
}
};
重点思路
换了一种dfs写法,因为递归层数是固定的,所以可以不采用push_back和pop_back这样的方式,直接按index赋值即可。本题需要注意前导0的处理,首项为0时,这个id必定为0。