文章目录

解题思路:时间复杂度O(
3
I
P
段数
∗
s
3^{IP段数} * s
3IP段数∗s),ip段数为4,s是字符串长度,空间复杂度O(IP段数) |
---|
- 题目并不是只要一种分割方案,所以需要回溯算法枚举
- IP地址需要分4段,第四段末尾不需要加点。并且第四段数字必须截止到字符串末尾(题目要求的)
- 前3段需要末尾加点,而分割数字的个数随便。
- 每次分割完,需要判断分割后的数字是否合法
例如25525511135这个例子,第一次分割2.第二次分割5,是满足条件的。但是如果第二次分割552的话,就不满足了,因为每个字段最大只能是255.

class Solution {
char sToArr[];
int len;
List<String> res = new ArrayList<>();
public boolean isValid(int start, int end) {
if (end - start + 1 >= 4 || end < start) return false;
if (sToArr[start] == '0' && end != start) return false;
int sum = 0;
for (int i = start; i <= end; i++) {
sum = sum * 10 + sToArr[i] - '0';
}
if (sum > 255) return false;
return true;
}
public List<String> restoreIpAddresses(String s) {
sToArr = s.toCharArray();
len = s.length();
char[] ip = new char[len+3];
backTracking( 1, 0, ip, 0);
return res;
}
public void backTracking( int pointNum, int start, char[] ip, int ipIndex) {
if (pointNum == 4) {
if (!isValid(start, len - 1)) return;
for (int i = start; i < len; i++) ip[ipIndex++] = sToArr[i];
res.add(new String(ip, 0, ipIndex));
return;
}
int temp = ipIndex;
for (int i = start; i <= start + 2 && i < len; i++) {
if (!isValid( start, i)) continue;
for (int j = start; j <= i; j++) ip[temp++] = sToArr[j];
ip[temp++] = '.';
backTracking( pointNum + 1, i + 1, ip, temp);
temp = ipIndex;
}
}
}