
方法:回溯
class Solution {
List<String> ans = new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
backtracking(s, 0, 0);
return ans;
}
public void backtracking(String s, int startIndex, int pointNum) {
if (pointNum == 3 && isValid(s, startIndex, s.length() - 1)) {
ans.add(s);
return;
}
for (int i = startIndex; i < s.length(); i++) {
if (!isValid(s, startIndex, i)) continue;
//插入圆点
s = s.substring(0, i + 1) + "." + s.substring(i + 1);
pointNum++;
//插⼊圆点之后下⼀个⼦串的起始位置为i + 2
backtracking(s, i + 2, pointNum);
//回溯删掉圆点
pointNum--;
s = s.substring(0, i + 1) + s.substring(i + 2);
}
}
public boolean isValid(String s, int start, int end) {
if (s == null || s.length() == 0) return false;
if (start > end) return false;
//含前导零,不符合
if (start < end && s.charAt(start) == '0') return false;
String str = s.substring(start, end + 1);
long num = Long.parseLong(str);
//不位于0-255,不符合
if (num < 0 || num > 255) return false;
return true;
}
}