题目描述
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
Example:
Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]
算法实现
这个问题首先要理解什么是有效的IP地址:
- 一个有效的IP地址被"."分为四段
- 如果一个段包含3个字符,那么这三个字符不能大于”255”,这是ip地址的基本知识;
- 如果一个字符包括2个或3个字符,它的第一个字符不能为0。
采用回溯法,分别判断从剩余字符中拿出第一个字符,前两个字符,前三个字符能不能组成一段,且剩余的字符能不能组成剩余的段数
//一个有效的IP地址被"."分为四段
//如果一个段包含3个字符,那么这三个字符不能大于”255”,这是ip地址的基本知识;
//如果一个字符包括2个或3个字符,它的第一个字符不能为0。
class Solution {
public:
vector<string> res;
vector<string> oneres;
vector<string> restoreIpAddresses(string s) {
if(s.empty())return res;
resIp(s,0,4);
return res;
}
//st为当前段开始的索引,c为剩余字符应该分配的段数
void resIp(string s, int st, int c){
// cout << st << "," << c << endl;
if(s.length() - st > 3*c || s.length() - st < 1*c)return;
//如果剩余字符分得一段,那么需要判断这一段能否满足要求,若满足要求则生成一种解决方案,否则退出进行回溯
if(c == 1){
int suanz = 0;
if(st == s.length() - 1 || s[st] != '0'){
for(int i = s.length() - 1; i >= st; i --){
int d = pow(10,s.length() - 1 - i);
suanz += d * (s[i] - '0');
}
if(suanz <= 255){
string stringres;
for(auto c:oneres){
stringres += c;
stringres += '.';
}
stringres += s.substr(st);
res.push_back(stringres);
}
}
return;
}
//如果剩余字符可以分得的段数大于1段,分别判断从剩余字符中拿出第一个字符,前两个字符,前三个字符能不能组成一段
oneres.push_back(s.substr(st,1));
resIp(s, st + 1, c - 1);
oneres.pop_back();
if(s[st] != '0' && st < s.length() - 2){
oneres.push_back(s.substr(st,2));
resIp(s, st + 2, c - 1);
oneres.pop_back();
if(st < s.length() - 3 && (s[st] - '0')*100 + (s[st + 1] - '0')*10 + s[st + 2] - '0' <= 255){
oneres.push_back(s.substr(st,3));
resIp(s, st + 3, c - 1);
oneres.pop_back();
}
}
}
};