93. 复原IP地址
- 复原IP地址
难度中等365
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 '.'分隔。
示例:
输入: "25525511135" 输出: ["255.255.11.135", "255.255.111.35"]
1.暴力解
//25525511135->255.255.111.35 255.255.11.135
public List<String> restoreIpAddresses(String s) {
List<String> res = new ArrayList<String>();
if(s == null || s.length() == 0){
return res;
}
StringBuffer sb = new StringBuffer();
//暴力解
for (int a = 1; a < 4 ; a++) {
for (int b = 1; b< 4 ; b++) {
for (int c = 1; c < 4 ;c++) {
for (int d = 1; d < 4 ;d++) {
//当a+b+c+d的长度等于s的长度 才可以转换
if ((a + b + c + d) == s.length()) {
int aNum = Integer.parseInt(s.substring(0,a));//a地址
int bNum = Integer.parseInt(s.substring(a,a+b));//b地址
int cNum = Integer.parseInt(s.substring(a+b,a+b+c));//c地址
int dNum = Integer.parseInt(s.substring(a+b+c));//d地址
if (aNum<=255 && bNum<=255 && cNum <= 255 && dNum <= 255) {
sb.append(aNum).append(".").append(bNum).append(".").append(cNum).append(".").append(dNum);
if (sb.length() == s.length()+3 ) {
res.add(new String(sb.toString()));
}
//删除之前存储的数据
sb.delete(0,sb.length());
}
}
}
}
}
}
return res;
}
2.dfs
public List<String> restoreIpAddresses(String s) {
int len = s.length();
List<String> res = new ArrayList<>();
if (len > 12 || len < 4) {
return res;
}
Deque<String> path = new ArrayDeque<>(4);
dfs(s, len, 0, 4, path, res);
return res;
}
// 需要一个变量记录剩余多少段还没被分割
private void dfs(String s, int len, int begin, int residue, Deque<String> path, List<String> res) {
if (begin == len) {
if (residue == 0) {
res.add(String.join(".", path));
}
return;
}
for (int i = begin; i < begin + 3; i++) {
if (i >= len) {
break;
}
if (residue * 3 < len - i) {
continue;
}
if (judgeIpSegment(s, begin, i)) {
String currentIpSegment = s.substring(begin, i + 1);
path.addLast(currentIpSegment);
dfs(s, len, i + 1, residue - 1, path, res);
path.removeLast();
}
}
}
//判断ip端数据是否正常
private boolean judgeIpSegment(String s, int left, int right) {
int len = right - left + 1;
if (len > 1 && s.charAt(left) == '0') {
return false;
}
int res = 0;
while (left <= right) {
res = res * 10 + s.charAt(left) - '0';
left++;
}
return res >= 0 && res <= 255;
}