难度:medium
题目:
IP 地址是一个32位的整数,每8位的十进制组成一个数,用 . 分隔
很明显是一个回朔法的题,特别注意的是遇到0时的情况,还有每个数值要小于256,进行剪枝减小运算量
AC解:
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
int len = s.length();
vector<string> v;
vector<string> temp;
backTrack(v, temp, s, 0, len);
return v;
}
void backTrack(vector<string>& v, vector<string>& temp, string& s,
int start, int len) {
if (start == len && temp.size() == 4) {
v.push_back(temp[0] + "." + temp[1] + "."
+ temp[2] + "." + temp[3]);
return;
}
if (len - start > (4 - temp.size()) * 3)
return; //剪枝
if (len - start < (4 - temp.size()))
return; //剪枝
int sum = 0;
for (int i = start; i < len && i < start + 3; i++) {
sum = 10 *sum + s[i] - '0';
if (sum > 255) return; //剪枝
temp.push_back(s.substr(start, i - start + 1));
backTrack(v, temp, s, i + 1, len);
temp.pop_back();
if (sum == 0) return; //剪枝
}
}
};