回溯大法
- IP地址有四个位置,每个位置的范围为 [0,255]
- 当0开头时,这个位置只能为0,不能为00或者01等其他值
- 当四个位置都被填充 或者 字符串被使用完时,进行回溯
- 其中,四个位置都被填充 并且 字符串被使用完时,代表发现一个新的IP地址
- 其他情况均不合法,直接返回
- 每一次回溯之后,尝试在当前IP位置再加一位,进行边界判定
- 判定成功,则继续递归寻找下一个位置的值
- 判定失败,则进行回溯,回溯到上一个位置
class Solution {
private:
static constexpr int SEG_COUNT = 4;
vector<string> res;
vector<int>segments;
public:
void dfs(const string &s, int segID, int str_start)
{
if(segID == SEG_COUNT)
{
if(str_start == s.size())
{
string IPAddr = "";
for(int i=0;i<SEG_COUNT;i++)
{
IPAddr += to_string(segments[i]);
if(i != SEG_COUNT-1)
IPAddr += ".";
}
res.push_back(IPAddr);
}
return;
}
if(str_start == s.size())
return;
if(s[str_start] == '0')
{
segments[segID] = 0;
dfs(s, segID+1, str_start+1);
return;
}
int addr = 0;
for(int i=str_start; i<s.size(); i++)
{
addr = addr*10 + (s[i]-'0');
if(addr>255)
return;
segments[segID] = addr;
dfs(s, segID+1, i+1);
}
}
vector<string> restoreIpAddresses(string s) {
segments.resize(SEG_COUNT);
dfs(s, 0, 0);
return res;
}
};