class Solution {
public:
// 回溯函数,负责分割IP地址的四段
void backtrack(const string &s, int start, int segId, vector<string> &segments, vector<string> &res) {
// 如果已经分成4段
if (segId == 4) {
// 并且所有字符都用完,说明是一个有效IP
if (start == s.size()) {
res.push_back(segments[0] + '.' + segments[1] + '.' + segments[2] + '.' + segments[3]);
}
return; // 结束本次递归
}
// 每一段尝试1~3个字符
for (int len = 1; len <= 3; ++len) {
// 剩余字符不够了,直接跳出
if (start + len > s.size()) break;
// 取出当前尝试的这段字符串,从字符串 s 的 第 start 个位置开始,取连续的 len 个字符。
string part = s.substr(start, len);
// 剪枝1:不能有前导0(除了单独的"0")
if (part.size() > 1 && part[0] == '0') continue;
// 剪枝2:不能超过255
if (stoi(part) > 255) continue;
// 保存当前段到segments
segments[segId] = part;
// 递归处理下一段
backtrack(s, start + len, segId + 1, segments, res);
}
}
vector<string> restoreIpAddresses(string s) {
vector<string> res; // 存储最终结果
vector<string> segments(4); // 临时存放每一段IP的字符串
backtrack(s, 0, 0, segments, res); // 从第0个字符、第0段开始递归
return res; // 返回结果
}
};
93. 复原 IP 地址
最新推荐文章于 2025-09-01 21:38:30 发布