解题思路
每段长度为1~3,数值很小可以暴力枚举;
对每一段进行IP判断,可以的话记录并往下进行,不行就跳过;
四段全部满足要求的就是答案;
套娃,代码还是好理解的;
代码
class Solution {
private:
vector<string> ans;
public:
bool isok(string s) {
int n = s.size();
if(n > 3 || n == 0) return false;
if(n != 1 && s[0] == '0') return false;
return stoi(s) < 256;
}
vector<string> restoreIpAddresses(string s) {
int n = s.size();
if(n > 12) return ans;
for(int i = 1; i < 4 && i < n; i++) {
if(isok(s.substr(0, i))) {
string tmp1 = s.substr(0, i);
for(int j = i + 1; j < i + 4 && j < n; j++) {
if(isok(s.substr(i, j - i))) {
string tmp2 = tmp1 + "." + s.substr(i, j - i);
for(int k = j + 1; k < j + 4 && k < n; k++) {
if(isok(s.substr(j, k - j))) {
string tmp3 = tmp2 + "." + s.substr(j, k - j);
if(isok(s.substr(k))) ans.push_back(tmp3 + "." + s.substr(k));
}
}
}
}
}
}
return ans;
}
};