题解 | #数字字符串转化成IP地址#
数字字符串转化成IP地址
https://www.nowcoder.com/practice/ce73540d47374dbe85b3125f57727e1e
class Solution { public: vector<string> restoreIpAddresses(string s) { vector<string> result; string path; dfs(s, 0, path, result); return result; } void dfs(const string& s, int index, string& path, vector<string>& result) { //记录IP部分的个数,IP有效是4个部分,然后如果是4个部分了,将字符串分完了,说明有效 if (index == 4 && s.empty()) { result.push_back(path); return; } //如果此时分了四个部分,但是s还有多余的,说明没分完,这轮是无效的 if (index >=4&&!s.empty()) return; //每一个部分一共就3个数字,因此取3个数字就是一个部分了 for (int i = 1; i <= 3; i++) { //如果字符串s是空的,就没必要了 if (s.empty()) { break; } //如果字符串s的大小少于能分的个数了,也没必要了 if (s.size() < i) break; //如果是一个字符串的首部,且该首部是0开头,后续就不能再是非0数了 if (i != 1 && s[0] == '0') { break; } //截取到i位置的数,作为这一部分的数 string temp = s.substr(0, i); int num = std::stoi(temp); if (num >= 0 && num <= 255) { //如果是index==0的 (也就是IP地址的第一部分),就没必要插入'.',其余的才需要去插入'.' if (index != 0) { path.push_back('.'); } //加入到路径的后面 path.append(temp); //继续dfs dfs(s.substr(i), index + 1, path, result); //回溯 //如果index==0,说明这时回溯不需要考虑'.',如果index!=0说明需要考虑'.' if (index != 0) path.resize(path.size() - i - 1); else path.resize(path.size() - i); } } } };