代码解决
class Solution { public: // 存储最终结果的向量 vector<string> result; // 判断字符串s从start到end范围内的子串是否是一个合法的IP地址段 bool isValid(const string& s, int start, int end) { if (start > end) { return false; // 起始位置大于结束位置,不合法 } if (s[start] == '0' && start != end) { return false; // 段中以0开头且长度大于1,不合法 } int num = 0; for (int i = start; i <= end; i++) { if (s[i] > '9' || s[i] < '0') { return false; // 不是数字字符,不合法 } num = num * 10 + (s[i] - '0'); // 计算该段的数值 if (num > 255) { return false; // 数值大于255,不合法 } } return true; // 合法的IP地址段 } // 回溯法 void backtracing(string s, int index, int pointnum) { // 已经插入了三个点 if (pointnum == 3) { // 检查最后一个段是否合法 if (isValid(s, index, s.size() - 1)) { result.push_back(s); // 合法则将该IP地址加入结果 } return; } // 遍历当前字符的所有可能位置 for (int i = index; i < s.size(); i++) { // 检查当前段是否合法 if (isValid(s, index, i)) { s.insert(s.begin() + i + 1, '.'); // 插入点 pointnum++; // 点数加一 backtracing(s, i + 2, pointnum); // 继续递归,处理下一个段 pointnum--; // 回溯,点数减一 s.erase(s.begin() + i + 1); // 移除点 } else { break; // 当前段不合法,退出循环 } } } // 主函数 vector<string> restoreIpAddresses(string s) { // 长度小于4或大于12,不可能形成合法的IP地址 if (s.size() < 4 || s.size() > 12) { return result; } // 开始回溯 backtracing(s, 0, 0); return result; } };
isValid函数:
- 用于判断字符串s从start到end范围内的子串是否是一个合法的IP地址段。
- 合法的IP地址段应满足:长度在1到3之间;不以‘0’开头(除非段长度为1);值在0到255之间。
backtracing函数:
- 采用回溯法生成所有可能的IP地址组合。
index
表示当前处理的位置,pointnum
表示已经插入的点的数量。- 当插入了3个点后,检查最后一个段是否合法,如果合法则将其加入结果。
- 对于每个位置,如果当前段合法,则插入一个点并递归处理下一个段。
restoreIpAddresses函数:
- 主函数,首先检查字符串的长度是否在合法范围内(4到12之间)。
- 然后调用
backtracing
函数生成所有可能的合法IP地址。