力扣 93 题
class Solution {
public:
vector<string> ans;
vector<int> cnt;
void dfs(string s,int id,int start){
if(id == 4){
if(start == s.size()){
string addr;
for(int i =0;i<4;++i){
addr += to_string (cnt[i]);
if(i < 3){
addr += ".";
}
}
ans.push_back(addr);
}
return;
}
//如果还没有找到 4 段 IP 地址就已经遍历完了字符串,那么提前回溯
if(start == s.size()){
return;
}
//由于不能有前导零,如果当前数字为 0 ,那么这一段 IP 地址只能为 0
if(s[start] == '0'){
cnt[id] = 0;
dfs(s,id+1,start+1);
}
//一般情况,枚举每一种情况并递归
int count =0;
for(int end = start;end<s.size();end++){
count = s[end] - '0' + count * 10;
if(count > 0 && count <= 0xFF){
cnt[id] = count;
dfs(s,id+1,end+1);//原 end 数值不能变,回溯
}else{
break;
}
}
}
vector<string> restoreIpAddresses(string s) {
cnt.resize(4); //不可缺少,否则 cnt 是 null 空的
dfs(s,0,0);
return ans;
}
};