这道题我写了两种方法,一种是三重for循环,因为IP地址最多只有四节,那三重for循环就够用了,不像别的回溯题,有n个for循环,不得不用回溯。
class Solution {
public List<String> restoreIpAddresses(String s) {
List<String> ans = new ArrayList<>();
if (s.length() < 4 || s.length() > 12) return ans;
for (int i = 1; i <= s.length() && i <= 3; i++) {
String s1 = s.substring(0, i);
if (s1.length() > 1 && s1.charAt(0) == '0') continue;
if (Integer.parseInt(s1)>255) continue;
for (int j = i + 1; j <= s.length() && j <= i + 3; j++) {
String s2 = s.substring(i, j);
if (Integer.parseInt(s2)>255) continue;
if (s2.length() > 1 && s2.charAt(0) == '0') continue;
for (int k = j + 1; k <= s.length() && k <= j + 3; k++) {
String s3 = s.substring(j, k);
String s4 = s.substring(k);
if (s3.length() > 1 && s3.charAt(0) == '0') continue;
if (s4.length() > 1 && s4.charAt(0) == '0') continue;
if (s4.length() > 3 || s4.length() < 1) continue;
if (Integer.parseInt(s3)>255||Integer.parseInt(s4)>255) continue;
StringBuilder sb = new StringBuilder();
sb.append(s1);
sb.append(".");
sb.append(s2);
sb.append(".");
sb.append(s3);
sb.append(".");
sb.append(s4);
ans.add(sb.toString());
}
}
}
return ans;
}
}
另外就是经典的回溯模版解法
class Solution {
List<String> ans = new ArrayList<>();
StringBuilder sb=new StringBuilder();
public List<String> restoreIpAddresses(String s) {
traceback(s,0,0);
return ans;
}
public void traceback(String s,int start,int num){
if (start==s.length()&&num==4){
ans.add(sb.substring(0,sb.length()-1).toString());
return;
}
if (num>=4||start==s.length()) return;
for (int i=start+1;i<=s.length()&&i-start<4;i++){
String s1 = s.substring(start, i);
if (!isValid(s1)) break;
sb.append(s1+".");
traceback(s,i,num+1);
sb.delete(sb.length()-s1.length()-1,sb.length());
}
}
public boolean isValid(String s){
if (s.length()<1||s.length()>3||Integer.parseInt(s)>255) return false;
if (s.length()>1&&s.charAt(0)=='0') return false;
return true;
}
}