题目描述
明确以下几个问题
- 给出的字符串要分成四个部分即加入3个点进去
- 要对当前的子串是否有效进行判断(写一个函数)
- 其他大体还是回溯法的步骤进行求解
因此最重要的是我们画出树形图进行求解
代码实现
class Solution {
private:
vector<string> res;
// 判断字符子串是否有效
bool isvalid(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(string& s, int start_index, int point_num)
{
// 当以及加入三个点之后可以进行判断是否最后一个子串符合要求
if(point_num==3)
{
if(isvalid(s, start_index, s.size()-1))
{
res.push_back(s);
}
return;
}
for(int i=start_index; i<s.size(); i++)
{ 假如当前子串有效即进行回溯
if(isvalid(s, start_index, i))
{
// 先插入一个点
s.insert(s.begin()+i+1, '.');
point_num +=1; // 数目++
backtracking(s, i+2, point_num);
point_num -= 1;
s.erase(s.begin()+i+1);
}
}
return;
}
public:
vector<string> restoreIpAddresses(string s) {
backtracking(s, 0, 0);
return res;
}
};