给定一串数字,通过相邻数字的左右组合,求出其所有的ip组合,例如"25525511135"的所有组合为:["255.255.11.135", "255.255.111.35"].
该道题可以使用深搜+回溯算法得出符合要求的结果。
在每次深搜的每次操作中,可以对数字进行1到3位的截取,如果截取了3次之后再无可截取时,正好可组合为一个ip。具体算法如下:
public class JavaTest {
public static void main(String[] args) {
numberToIp("25525511135");
}
private static void numberToIp(String src) {
List<LinkedList<Integer>> result = new ArrayList<>();
numberToIp(src, result, new LinkedList<Integer>(), 0);
// 输出所有转换的ip结果
for (LinkedList<Integer> r: result) {
for(int p: r) {
System.out.print(p+" ");
}
System.out.println();
}
}
/**
* @param src 事件源
* @param result 记录的总结果
* @param path 一次深搜的结果
* @param index 当前的定位点
*/
private static void numberToIp(String src, List<LinkedList<Integer>> result, LinkedList<Integer> path, int index) {
// 如果path存储个数以达到4个,但src仍未截取完,则不再需要继续截取,
// 因为ip只有4位,该次深搜作废
if (index < src.length() && path.size() == 4) return;
// 正好截满4个,则做该次深搜结果存储操作
if (index == src.length() && path.size() == 4) {
result.add((LinkedList<Integer>) path.clone());
return;
}
// 每次可以从index开始往后截取i个位置
for (int i = 1; i <= 3; i++) {
// 越界剪枝
if (index + i <= src.length()) {
int number = Integer.parseInt(src.substring(index, index + i));
// ip逻辑剪枝
if (number > 255) continue;
path.addLast(number);
numberToIp(src, result, path, index + i);
// 该次深搜完毕,重置,开始下一个深搜
path.removeLast();
}
}
}
}