本题需要画图具体判断,由于分支太多,直接剪枝符合要求的结果即可。
class Solution {
List<String> res = new LinkedList<>();
public List<String> restoreIpAddresses(String s) {
if (s == null || s.length() == 0 || s.length() > 12) return res;
backTrack(s, 0, 0);
return res;
}
private void backTrack(String s, int index, int pointNum) {
//判断加入"." 的个数,当为3时,说明搜索到结尾需要判断了
if (pointNum == 3) {
//此时如果当前点后的那一段字符串符合要求,那么把该字符串加入结果集
if (isValid(s, index, s.length() - 1)) {
res.add(s);
}
return;
}
for (int i = index; i < s.length(); i ++) {
//如果当前截断的字符串部分合法
if (isValid(s, index, i)) {
//在字符串的该处加入一个".",其他不变
s = s.substring(0, i + 1) + "." + s.substring(i + 1);
//加入点后下一次需要在点后继续递归,所以是i + 2,令点数量+1
backTrack(s, i + 2, pointNum + 1);
//回溯,把点去掉
s = s.substring(0, i + 1) + s.substring(i + 2);
}else {
//不符合调节的直接取消循环
break;
}
}
}
//判断是否符合条件
private boolean isValid(String s, int start, int end) {
if (start > end || end - start > 2) return false;
if (end != start && s.charAt(start) == '0') return false;
int sum = 0;
for (int i = start; i <= end; i ++) {
if (s.charAt(i) > '9' || s.charAt(i) < '0') return false;
sum = sum * 10 + s.charAt(i) - '0';
if (sum > 255) return false;
}
return true;
}
}