A valid IP address consists of exactly four integers separated by single dots. Each integer is between 0
and 255
(inclusive) and cannot have leading zeros.
- For example,
"0.1.2.201"
and"192.168.1.1"
are valid IP addresses, but"0.011.255.245"
,"192.168.1.312"
and"[email protected]"
are invalid IP addresses.
Given a string s
containing only digits, return all possible valid IP addresses that can be formed by inserting dots into s
. You are not allowed to reorder or remove any digits in s
. You may return the valid IP addresses in any order.
Example 1:
Input: s = "25525511135" Output: ["255.255.11.135","255.255.111.35"]
Example 2:
Input: s = "0000" Output: ["0.0.0.0"]
Example 3:
Input: s = "101023" Output: ["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
Constraints:
1 <= s.length <= 20
s
consists of digits only.
Companies: Yandex, TikTok, Oracle, Amazon, Microsoft, Yahoo, Google, Facebook, Apple, ByteDance, Cisco, Arista Networks, Verkada
Related Topics:
String, Backtracking
Similar Questions:
Plain backtracking. Maximum depth is 4. Be aware of the cases where ip segment starts with 0
or ip segment is greater than 255
.
// OJ: https://leetcode.com/problems/restore-ip-addresses
// Author: github.com/lzl124631x
// Time: O(1)
// Space: O(1)
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> ans;
vector<int> tmp;
function<void(int)> dfs = [&](int i) {
if (i == s.size()) {
if (tmp.size() == 4) {
string ip;
for (int n : tmp) {
if (ip.size()) ip += '.';
ip += to_string(n);
}
ans.push_back(ip);
}
return;
}
for (int j = 0, n = 0; j < (s[i] == '0' ? 1 : 3) && i + j < s.size(); ++j) {
n = n * 10 + s[i + j] - '0';
if (n > 255) break;
tmp.push_back(n);
dfs(i + j + 1);
tmp.pop_back();
}
};
dfs(0);
return ans;
}
};