93. 复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。
示例:
输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]
解题
回溯算法,对给定s的每个位置尝试放’.’。
结束条件
点放完+s遍历完+最后的数字满足要求<=255;
失败条件
数字遍历完点还没放完
放点条件
前面不为’.’+还有点可放;
不放点条件
当前num*10+当前遍历的点大小<=255
额外条件:0打头时后面不能放数字
0前面为.时,后面不能放数字(只能放点或结束);
0前面为空时,后面不能放数字(只能放点或结束);
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
tmp="";
dfs(s,3,0,0);
return res;
}
private:
vector<string> res;
string tmp;
void dfs(string s,int dots, int i,int num){
if(dots==0&&i==s.size()&&num<=255) {
res.push_back(tmp);
return;
}
if(i==s.size()) return;
//放点
if(dots>0&&i>0&&tmp.back()!='.'){ //.前面不为.
tmp+='.';
dfs(s,dots-1,i,0);
tmp.pop_back();
}
//0开头则后面只能放点
if(i>1&&tmp.back()=='0'&&tmp[tmp.size()-2]=='.'||i==1&&tmp.back()=='0') return;
if(num*10+s[i]-'0'<=255){
tmp+=s[i];
dfs(s,dots,i+1,num*10+s[i]-'0');
tmp.pop_back();
}
}
};