這題的核心就是要放入 4 個 dot,而且放完之後隔出來的 4 個數字都要在 0-255 之間。所以很直覺就會想要用 backtracking 來做,接下來讓我們列一下幾個重點:
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> res;
string tmp;
helper(s, res, tmp, 3, 0);
return res;
}
private:
void helper(string& s, vector<string>& res, string& tmp, int dots, int pos) {
if(dots == 0) {
if(isValidChunk(s, pos, s.length())) {
string validAdd = tmp;
validAdd += s.substr(pos, s.length()-pos);
res.push_back(validAdd);
return;
}
else
return;
}
else {
for(int i=pos+1; i<s.length(); i++) {
if(!isValidChunk(s, pos, i))
continue;
string store = tmp;
tmp += s.substr(pos, i-pos);
tmp += ".";
helper(s, res, tmp, dots-1, i);
tmp = store;
}
}
}
bool isValidChunk(string s, int start, int end) {
if(end-start > 3) return false;
string sub = s.substr(start, end-start);
// Prevent IP chunk such as "010", "00", etc.
if(sub.length() > 1 && sub[0] == '0') return false;
int num = stoi(sub);
return num >=0 && num <= 255;
}
};
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> res;
string ans;
for (int a=1; a<=3; a++)
for (int b=1; b<=3; b++)
for (int c=1; c<=3; c++)
for (int d=1; d<=3; d++)
if (a+b+c+d == s.length()) {
int A = stoi(s.substr(0, a));
int B = stoi(s.substr(a, b));
int C = stoi(s.substr(a+b, c));
int D = stoi(s.substr(a+b+c, d));
if (A<=255 && B<=255 && C<=255 && D<=255)
if ( (ans=to_string(A)+"."+to_string(B)+"."+to_string(C)+"."+to_string(D)).length() == s.length()+3)
res.push_back(ans);
}
return res;
}
};