题目链接
思路分析
既然是复原IP地址,那么就必然需要一个判断是否符合IP的函数,其次我们对于一段处理好的子串,需要将其提取出来,以及在回溯的时候,我们要将这一段数据删除,这几个函数的边界处理问题时需要注意的,
最后,如果在某一段发现数据不合格,就说明这样的切割方法是没有结果过的,直接跳出就可以
代码实现
class Solution {
public:
string path;
vector<string> ret;
// 判断字符串s在左闭又闭区间[start, end]所组成的数字是否合法
bool isVaild(const string& s, int start, int end) {
if (start > end) {
return false;
}
if (s[start] == '0' && start != end) { // 0开头的数字不合法
return false;
}
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) { // 如果大于255了不合法
return false;
}
}
return true;
}
void backtracking(const string &s, int pointNum, int startIndex)
{
if(pointNum == 3)
{
if(isVaild(s, startIndex, s.size()-1))
{
path += s.substr(startIndex, s.size()- startIndex);
ret.push_back(path);
}
return ;
}
for(int i = startIndex; i < s.size(); ++i)
{
if(isVaild(s, startIndex, i))
{
pointNum++;
path += s.substr(startIndex, i - startIndex + 1) + '.';
backtracking(s, pointNum, i+1);
pointNum--;
path.resize( startIndex + pointNum );
}
//在这里break
else
break;
}
}
vector<string> restoreIpAddresses(string s) {
backtracking(s, 0, 0);
return ret;
}
};