题目
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
解题
- 递归 + 回溯
- 简单来说, 就是ip的每一段分别取1位, 2位, 3位, 分别穷举之后的字符, 并判断每部分是否为有效的ip, 代码如下:
class Solution {
List<String> result = new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
if (null == s || s.length() < 4) {
return result;
}
restoreValidIp(s, 1, 0, "");
return result;
}
/**
* 在字符串查找第part部分可能的有效组合
* @param s
* @param part
* @param start
* @param temp
*/
private void restoreValidIp(String s, int part, int start, String temp){
int length = s.length();
if (start >= length) {
return;
}
if (part == 4) {
if (isValid(s.substring(start))) {
result.add(temp + s.substring(start));
}
return;
} else {
String partStr;
for (int i = 1; i <= 3 && start + i < length ; i++) {
partStr = s.substring(start, start + i);
if (isValid(partStr)) {
restoreValidIp(s, part + 1, start + i, temp + partStr + "." );
}
}
}
}
private boolean isValid(String partIp){
if (partIp.length() > 3) {
return false;
}
if (partIp.startsWith("0")) {
return "0".equals(partIp);
} else {
return Integer.valueOf(partIp) <= 255;
}
}
}