93. Restore IP Addresses
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"]
// Backtracking
void helper(string s, int n, string cur, vector<string>& res) {
if (n == 4) {
if (s.empty()) res.push_back(cur);
return;
}
for (int i = 1; i <= 3; ++i) {
if (s.length() < i) break;
int val = stoi(s.substr(0, i));
if (val > 255 || std::to_string(val).length() != i) continue;
helper(s.substr(i), n + 1, cur + s.substr(0, i) + (n == 3 ? "" : "."), res);
}
}
vector<string> restoreIpAddresses(string s) { // time: O(3^n); space: O(3^n)
vector<string> res;
helper(s, 0, "", res);
return res;
}
// Backtracking
bool isValid(const string& s) {
if (s.empty() || s.length() > 3 || (s.length() > 1 && s[0] == '0')) return false;
int num = stoi(s);
return num >= 0 && num <= 255;
}
void helper(string s, int k, string str, vector<string>& res) {
if (k == 0) {
if (s.empty()) res.push_back(str);
return;
}
for (int i = 1; i <= 3; ++i) {
if (s.length() >= i && isValid(s.substr(0, i))) {
string new_str = str + s.substr(0, i) + (k == 1 ? "" : ".");
helper(s.substr(i), k - 1, new_str, res);
}
}
}
vector<string> restoreIpAddresses(string s) { // time: O(3^n); space: O(3^n)
vector<string> res;
helper(s, 4, "", res);
return res;
}
Last updated
Was this helpful?