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)
We can apply depth first search to this problem. But we need to pay attention to every corner case. If current char is 0, it can only appear in a single segment. For example, if the string is '11011', it cannot be converted to '1.1.01.1'.
C++ Code:
/*
* func: restore_ip_address_helper
* goal: DFS helper function to find possible ip address
* @param candidate: current candidate ip address
* @param section: which section of ip is dealt with now
* @param s: input string s
* @param result: final result set
* return:
*/
void restore_ip_address_helper(string &candidate, int section, string s, vector<string> &result){
//If the remaining string is longer than the maximum, then return
if(s.length() == 0 || s.length() > (4-section+1) * 3){
return;
}
//If current section is the last one
if(section == 4){
//If there is only one bit remained
if(s.length() == 1){
candidate += s;
result.emplace_back(candidate);
}
//If there are more than one bits remained and the first one is not 0
else if(s.length() > 1 && s.length() <= 3 && s[0] != '0' && atoi(s.c_str()) <= 255){
candidate += s;
result.emplace_back(candidate);
}
return;
}
//If the first one is 0, we have to put it into a single section
if(s[0] == '0'){
candidate += '0';
candidate += '.';
restore_ip_address_helper(candidate, section+1, s.substr(1), result);
}else{
string cpy = candidate;
for(int i = 1; i <= std::min(3, static_cast<int>(s.length())); i++){
string tmp = s.substr(0, i);
if(atoi(tmp.c_str()) <= 255){
candidate += tmp;
candidate += '.';
restore_ip_address_helper(candidate, section+1, s.substr(i), result);
candidate = cpy;
}
}
}
}
/*
* func: restore_ip_address
* goal: restore ip address from a string
* @param s: a input string
* return: all possible ips
*/
vector<string> restore_ip_address(string s){
vector<string> result;
string candidate = "";
restore_ip_address_helper(candidate, 1, s, result);
return result;
}
Python Code:
# func: restore ip address from a string
# @param s: input string
# @return: all possible ips
def restore_ip_address(s):
result = []
def restore_ip_address_helper(candidate, section, str):
if len(str) == 0 or len(str) > (5-section) * 3:
return
if section == 4:
if len(str) == 1:
candidate += str
result.append(candidate)
elif 1 < len(str) <= 3 and str[0] != '0' and int(str) <= 255:
candidate += str
result.append(candidate)
return
if str[0] == '0':
candidate += '0.'
restore_ip_address_helper(candidate[:], section+1, str[1:])
else:
tmp = candidate[:]
for i in xrange(1, min(4, len(str)+1)):
if int(str[0:i]) <= 255:
candidate += str[0:i] + '.'
restore_ip_address_helper(candidate[:], section+1, str[i:])
candidate = tmp[:]
restore_ip_address_helper("", 1, s)
return result
No comments:
Post a Comment