给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
解题思路:深度优先搜索+回溯,需要注意的是,每次深度搜索时,可以限制每个IP段的长度范围,最短为每个未确定的IP段占三个字符长度时剩余的字符数(需大于0),最长为每个未确定的IP段占一个字符长度时剩余的字符数(需小于等于3);以及对字符'0'的处理
Java代码:
class Solution {
public List<String> restoreIpAddresses(String s) {
List<String> res = new LinkedList<>();
if(4 > s.length() || 12 < s.length())
return res;
dfs(s, 0, 0, res);
return res;
}
private void dfs(String s, int index, int part, List<String> res){
if(3 == part){
if("0".equals(s.substring(index, s.length())) ||
('0' != s.charAt(index) && Integer.parseInt(s.substring(index, s.length())) <= 255))
res.add(s);
return;
}
if('0' == s.charAt(index)){
dfs(s.substring(0, index+1) + "." + s.substring(index+1, s.length()), index+1+1, part+1, res);
} else {
for(int i = Math.max(s.length()-index-3*(4-part-1), 1); i <= Math.min(s.length()-index-1*(4-part-1), 3); i++){
if(Integer.parseInt(s.substring(index, index+i)) <= 255){
dfs(s.substring(0, index+i) + "." + s.substring(index+i, s.length()), index+i+1, part+1, res);
}
}
}
}
}