题目描述:
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
Example
题目思路:
Given "25525511135"
, return
[
"255.255.11.135",
"255.255.111.35"
]
Order does not matter.
这题用recursion就好了,也算是一道经典的recursion题。这里需要注意的是,每次寻找可能的digit,有三种可能:
1. 1-digit,
2. 2-digit with non-zero as first digit,
3. 3-digit <= 255
第二第三种可能都是带条件的,需要仔细考虑。
Mycode(AC = 22ms):
class Solution {
public:
/**
* @param s the IP string
* @return All possible valid IP addresses
*/
vector<string> restoreIpAddresses(string& s) {
// Write your code here
vector<string> ans;
vector<string> sofar;
restoreIpAddressesHelper(s, ans, sofar);
return ans;
}
void restoreIpAddressesHelper(string& s, vector<string>& ans, vector<string>& sofar) {
// if having collected the full ip address,
// push it into ans
if (s.length() == 0) {
if (sofar.size() == 4) {
ans.push_back(vector2ip(sofar));
return;
}
return;
}
else {
// the next possible number in ip is:
// 1-digit,
// 2-digit with non-zero as first digit,
// 3-digit <= 255
for (int i = 1; i <= 3; i++) {
if ((i < 3 && s.length() >= i) ||
(i == 3 && s.length() >= i && s.substr(0, 3) <= "255"))
{
if (i >= 2 && s[0] == '0') continue;
string tmp = s.substr(i);
sofar.push_back(s.substr(0, i));
restoreIpAddressesHelper(tmp, ans, sofar);
sofar.pop_back();
}
}
return;
}
}
// convert numbers in vector into string ip
string vector2ip(vector<string>& sofar) {
string ip = "";
for (int i = 0; i < sofar.size(); i++) {
ip = ip + "." + sofar[i];
}
return ip.substr(1);
}
};