Given a string containing only digits, restore it by returning all possible valid IP address combinations.
For example:
Given "25525511135"
,
return ["255.255.11.135", "255.255.111.35"]
. (Order does not matter)
Difficulty: Medium
简单的backtracking 题,注意下各个条件检查。
class Solution {
public:
bool canIP(string s){
int ans = 0;
for(int i = 0; i<3; i++){
ans = ans * 10 + (s[i] - '0');
}
if(ans>255)
return false;
else
return true;
}
void back_tracking(int dep, string s, string temp_string, vector<string>& ans){
if(s.size() == 0)
return;
if(dep == 1){
if((s.size() > 3) || (s.size()==3 && (!canIP(s) || s[0] - '0' == 0)) || (s.size()==2 && s[0] - '0' == 0))
return;
else{
temp_string = temp_string + '.';
temp_string = temp_string + s;
ans.push_back(temp_string);
return;
}
}
else{
int i = 1;
while(i <= 3){
if(s.size() <= i){
i++;
continue;
}
if((i == 2 && s[0] - '0' == 0) || (i == 3 && (s[0] - '0' == 0 || !canIP(s)))){
i++;
continue;
}
string tempS = s.substr(i, s.size() - i);
if(dep == 4)
back_tracking(dep-1, tempS, s.substr(0, i), ans);
else
back_tracking(dep-1, tempS, temp_string + '.' + s.substr(0, i), ans);
i++;
}
}
return;
}
vector<string> restoreIpAddresses(string s) {
vector<string> ans;
string temp;
back_tracking(4, s, temp, ans);
return ans;
}
};