题目
地址:https://leetcode.com/problems/restore-ip-addresses/
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
Example:
Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]
DFS回溯算法
思路解析:
- IP分为4个部分,每个部分的范围为
[0, 255]
. 所以每个部分的判断逻辑分为如果第一位是0,那么长度只能为1;如果每个部分长度等于3,则校验数据不大于255.if ((part.startsWith("0") && part.length() > 1) || (i == 3 && Integer.valueOf(part) > 255))
- 每部分的长度范围为
[1, 3]
, 所以每个部分都有这个范围的循环。 - 合格终止条件,如果4个部分集齐,并且开始位置等于字符串的长度,则添加到结果列表。
- 异常终止条件,如果4个部分集齐,但是开始位置不等于字符串长度,则退出;
或者如果4个部分未集齐,但是开始位置已经大于等于字符串长度,则退出。
package backtracking;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
// https://leetcode.com/problems/restore-ip-addresses/
public class RestoreIPAddress {
public static void main(String[] args) {
RestoreIPAddress obj = new RestoreIPAddress();
String s = "25525511135";
List<String> resultList = obj.restoreIpAddresses(s);
System.out.println(Arrays.toString(resultList.toArray()));
}
public List<String> restoreIpAddresses(String s) {
List<String> resultList = new ArrayList<String>();
if (s == null || s.length() < 4) {
return resultList;
}
// DFS
dfs(resultList, s, 0, "", 0);
return resultList;
}
private void dfs(List<String> resultList, String s, int start, String stored, int count) {
//exit
if (start == s.length() && count == 4) {
resultList.add(stored);
}
if (start >= s.length() || count == 4) {
return;
}
for (int i = 1; i < 4; i++) {
if (start + i > s.length()) {
break;
}
String part = s.substring(start, start + i);
if ((part.startsWith("0") && part.length() > 1) || (i == 3 && Integer.valueOf(part) > 255)) {
continue;
}
dfs(resultList, s, start + i, stored + part + (count == 3 ? "" : "."), count + 1);
}
}
}
顺序遍历解法
思路解析:
- 挨个部分组装数据,并且每个部分的起点就是上一部分的终点;
- 验证每个部分是否符合规则,如果都符合,则添加到结果列表中。
public List<String> restoreIpAddressesWithIterate(String s) {
List<String> resultList = new ArrayList<String>();
if (s == null || s.length() < 4) {
return resultList;
}
int len = s.length();
String splitS = ".";
// iterate
for (int fisrt = 1; fisrt < 4 && fisrt < len - 2; fisrt++) {
for (int second = fisrt + 1; second < fisrt + 4 && second < len - 1; second++) {
for (int third = second + 1; third < second + 4 && third < len; third++) {
String part1 = s.substring(0, fisrt);
String part2 = s.substring(fisrt, second);
String part3 = s.substring(second, third);
String part4 = s.substring(third);
if (valideIP(part1) && valideIP(part2) && valideIP(part3) && valideIP(part4)) {
String result = part1 + splitS + part2 + splitS + part3 + splitS + part4;
resultList.add(result);
}
}
}
}
return resultList;
}
private Boolean valideIP(String part) {
if (part.length() == 0 || part.length() > 3
|| (part.startsWith("0") && part.length() != 1)
|| (part.length() == 3 && Integer.valueOf(part) > 255 )) {
return false;
}
return true;
}
下载
来源:CSDN
作者:程序员易筋
链接:https://blog.csdn.net/zgpeace/article/details/103952080