题目大意:给出一个仅包含数字的字符串,找出该字符串所有可能形成的IP地址。
算法思想:
采用深度优先搜索。
1.当遍历到字符串的末尾且组成了IP的四个部分时形成一个有效IP。
2.深搜过程中去除不能形成有效IP的情况。字符串的长度-遍历起点<剩余步骤数或者字符串的长度-遍历起点>剩余步骤数的总长度。
3.从每个起点开始计算其后3位形成的数值,如果小于255则是有效的将当前字符放入临时IP且进行下一步骤的搜索。如果值为0则终止计算来去除前缀0.
代码如下:
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> res;
string ip;
dfs(s,0,0,ip,res);
return res;
}
void dfs(string s,size_t start,size_t step,string ip,vector<string> &res){
if(start==s.size()&&step==4){
ip.resize(ip.size()-1);//去掉末尾的‘.’
res.push_back(ip);
return;
}
if(s.size()-start>(4-step)*3) return;//剪枝
if(s.size()-start<(4-step)) return;
int num=0;
for(int i=start;i<start+3;++i){
num=num*10+s[i]-'0';
if(num<=255){
ip+=s[i];
dfs(s,i+1,step+1,ip+'.',res);
}
if(num==0) break;//不允许前缀0
}
}
};