难度:medium
分割回文串的升级版,需要注意的是isValid方法是左闭右开的,需要注意区间!!
class Solution {
private List<String> ans = new ArrayList<>();
// 记录点号的个数
private int pointNum;
public List<String> restoreIpAddresses(String s) {
if (s == null || s.length() > 12) {
return ans;
}
backtracking(s, 0);
return ans;
}
public void backtracking(String s, int startIndex) {
// 3个逗点时,判断地址第四段是否符合要求
if (pointNum == 3) {
if (isValid(s, startIndex, s.length())) {
ans.add(s);
}
return;
}
for (int i = startIndex; i < s.length(); i++) {
// 切记是左闭右开区间
if (isValid(s, startIndex, i + 1)) {
s = s.substring(0, i + 1) + "." + s.substring(i + 1, s.length());
pointNum++;
// 插入了逗点,下一个子串起始地址应该+2
backtracking(s, i + 2);
pointNum--;
s = s.substring(0, i + 1) + s.substring(i + 2);
} else {
break;
}
}
}
// 判断左闭右开的数字是否合法
public boolean isValid(String s, int start, int end) {
if (start >= end) {
return false;
}
// 判断前导0
if (s.charAt(start) == '0' && end > start + 1) {
return false;
}
int num = 0;
for (int i = start; i < end; i++) {
// 判断是否含有除数字外的其他字符
if (s.charAt(i) < '0' || s.charAt(i) > '9') {
return false;
}
// 判断整数是否在0-255之间
num = num * 10 + (s.charAt(i) - '0');
if (num > 255) {
return false;
}
}
return true;
}
}