题目
思路分析
本题就是在一串字符串里面找到三个可以插入’.'的位置,保证分割之后的子字符串满足IP编码的方式。因此我们采用递归的方式进行探索。
- 每次DFS的过程中有三个变量,分别存储当前使用的’.‘的次数,最新插入的’.'的位置,当前的字符串。
- 每次从上次的位置开始探索,是否满足可以分割的条件。
代码
class Solution {
public:
int n;//字符串的长度
string str;//存储原字符串
vector<string> ans;//存储结果
//判断当前插入'.'之后的子字符串是否合理
bool isValid(int st, int ed){
int sum = 0;
for(int i = st;i <= ed;i++){
if(st != ed && str[st] == '0') return false;
sum = sum * 10 + str[i] - '0';
if(sum > 255) return false;
}
return true;
}
//递归入口
void DFS(int pointNum, int pos, string &cur){
if(pointNum == 3){
if(isValid(pos + 1, n - 1)) ans.push_back(cur);
return;
}
for(int i = pos + 1;i < n - 1;i++){
if(isValid(pos + 1, i)){
if((n - i ) > (4 - pointNum) * 3) continue;//插入字符串之后,如果剩余的长度大于最长的长度,继续。
cur.insert(cur.begin() + i + 1 + pointNum, '.');//插入字符串
DFS(pointNum + 1, i, cur);//下一层
cur.erase(i + 1 + pointNum, 1);//返回
}
}
}
vector<string> restoreIpAddresses(string s) {
n = s.size(), str = s;
DFS(0, -1, s);
return ans;
}
};