本文最后更新于613 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
题目链接/文章讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html
视频讲解:https://www.bilibili.com/video/BV1XP4y1U73i/
1.这个题和昨天的分割回文串的题差不多,但是这个题的迭代回溯逻辑略有不同,最近使用startIndex使用的次数很多,对这个参数的理解有了更多的理解,本题在原有的字符串上操作没有使用path数组进行计算,在合适的切割的字符串的后面插入'.'回溯后再删除,同时本题在剪枝上也是有新意,使用pointSum来限制树的深度。
CPP
class Solution {
public:
vector<string> res;
bool isvaild(const string& s, int start, int end){
if(start > end){
return false;
}
if(s[start] == '0' && start != end){
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){
return false;
}
}
return true;
}
void backtracking(string& s, int startIndex, int pointSum){
if(pointSum == 3){
if(isvaild(s, startIndex, s.size() -1)){
res.push_back(s);
return ;
}
}
for(int i = startIndex; i < s.size(); i++){
if(isvaild(s, startIndex, i)){
s.insert(s.begin() + i + 1, '.');
pointSum++;
backtracking(s, i + 2, pointSum);
pointSum--;
s.erase(s.begin() + i + 1);
}else break;
}
}
vector<string> restoreIpAddresses(string s) {
if(s.size() < 4 || s.size() > 12){
return res;
}
backtracking(s, 0, 0);
return res;
}
};