class Solution:
def restoreIpAddresses(self, s: str) -> list[str]:
def backtrack(start, path):
if len(path) == 4:
if start == len(s):
res.append(".".join(path))
return
for l in range(1, 4):
if start + l > len(s):
break
segment = s[start:start + l]
if (segment.startswith('0') and len(segment) > 1) or int(segment) > 255:
continue
backtrack(start + l, path + [segment])
res = []
backtrack(0, [])
return res
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> res;
vector<string> path;
backtrack(s, 0, path, res);
return res;
}
private:
void backtrack(const string& s, int start, vector<string>& path, vector<string>& res) {
if (path.size() == 4) {
if (start == s.size()) {
res.push_back(path[0] + "." + path[1] + "." + path[2] + "." + path[3]);
}
return;
}
for (int len = 1; len <= 3; ++len) {
if (start + len > s.size()) break;
string segment = s.substr(start, len);
if ((segment[0] == '0' && segment.length() > 1) || stoi(segment) > 255)
continue;
path.push_back(segment);
backtrack(s, start + len, path, res);
path.pop_back();
}
}
};
class Solution {
public List<String> restoreIpAddresses(String s) {
List<String> res = new ArrayList<>();
backtrack(s, 0, new ArrayList<>(), res);
return res;
}
private void backtrack(String s, int start, List<String> path, List<String> res) {
if (path.size() == 4) {
if (start == s.length()) {
res.add(String.join(".", path));
}
return;
}
for (int len = 1; len <= 3; ++len) {
if (start + len > s.length()) break;
String segment = s.substring(start, start + len);
if ((segment.startsWith("0") && segment.length() > 1) || Integer.parseInt(segment) > 255)
continue;
path.add(segment);
backtrack(s, start + len, path, res);
path.remove(path.size() - 1);
}
}
}
var restoreIpAddresses = function(s) {
const res = [];
function backtrack(start, path) {
if (path.length === 4) {
if (start === s.length) {
res.push(path.join('.'));
}
return;
}
for (let len = 1; len <= 3; ++len) {
if (start + len > s.length) break;
const segment = s.substring(start, start + len);
if ((segment.startsWith('0') && segment.length > 1) || Number(segment) > 255) continue;
path.push(segment);
backtrack(start + len, path);
path.pop();
}
}
backtrack(0, []);
return res;
};
s
containing only digits, return all possible valid IP address combinations that can be formed by inserting three dots into s
. Each segment of the IP address must be a number between 0 and 255, and cannot have leading zeros (except for the number 0 itself). You must use every digit in s
exactly once, and each solution must use a different placement of dots. No digit can be reused or omitted, and the order of digits must remain unchanged.
s = "25525511135"
: