用Java写出:复原IP地址
时间: 2024-03-08 20:48:45 浏览: 65
以下是Java代码实现复原IP地址:
```java
import java.util.*;
public class RestoreIPAddresses {
public List<String> restoreIpAddresses(String s) {
List<String> res = new ArrayList<>();
if (s == null || s.length() < 4 || s.length() > 12) {
return res;
}
dfs(s, "", 0, res);
return res;
}
private void dfs(String s, String path, int index, List<String> res) {
if (index == s.length() && countDots(path) == 3) {
res.add(path);
return;
}
if (countDots(path) > 3) {
return;
}
for (int i = index; i < s.length(); i++) {
String substr = s.substring(index, i + 1);
if (isValid(substr)) {
if (index == 0) {
dfs(s, substr, i + 1, res);
} else {
dfs(s, path + "." + substr, i + 1, res);
}
}
}
}
private boolean isValid(String s) {
if (s == null || s.length() == 0 || s.length() > 3) {
return false;
}
if (s.charAt(0) == '0' && s.length() > 1) {
return false;
}
int num = Integer.parseInt(s);
return num >= 0 && num <= 255;
}
private int countDots(String s) {
int count = 0;
for (char c : s.toCharArray()) {
if (c == '.') {
count++;
}
}
return count;
}
}
```
具体实现中,使用深度优先搜索(DFS)来枚举所有可能的IP地址。在DFS的过程中,使用一个path字符串来记录当前已经确定的IP地址,以及一个index变量来记录当前正在处理的字符串的下标。如果当前的path中已经有了4个数字,且整个字符串都被处理完了,则说明找到了一个合法的IP地址,将其加入到结果集中。如果当前path中的数字个数已经超过了4个,则说明这不是一个合法的IP地址,直接返回。否则,从index开始枚举所有可能的子串,如果当前子串是合法的,则递归处理后面的字符串,并将当前子串加入到path中。注意,如果是第一个数字,则不需要加上"."。在递归结束后,需要将当前子串从path中删除,以便处理其他可能的子串。isValid函数用于判断当前子串是否是合法的IP地址片段,countDots函数用于计算当前path中包含的"."的个数。
阅读全文