这道题不难哈,DFS做就好了。
这里分享一个楼主三次写这道题不同的代码。
先贴最近写的, 是不是很短很漂亮。
if (s.charAt(index) == '0' && i > index) break; 这一句是我最近学到的用来去除首位为零的多位数的trick。 还有学到的是尽量让base case帮你处理各种corner case, 这样主逻辑就不需要写那么多if else。
StringBuilder这个东西,用了确实可以提高效率,不过在这里就算了吧。数据那么小,还是以提高代码可读性为主。
public List<String> restoreIpAddresses(String s) {
List<String> ans = new ArrayList<>();
dfsHelper(s, 0, 0, ans, "");
return ans;
}
private void dfsHelper(String s, int index, int part, List<String> ans, String S) {
if (part == 4 || index == s.length()) {
if (part == 4 && index == s.length()) {
ans.add(S);
}
return;
}
for (int i = index; i < s.length() && i < index + 3; i++) {
if (s.charAt(index) == '0' && i > index) break;
if (Integer.parseInt(s.substring(index, i + 1)) < 256) {
dfsHelper(s, i + 1, part + 1, ans,
S + (S.length() == 0 ? "" : ".") + s.substring(index, i + 1));
}
}
}
中间一次的, 有点长,马马虎虎吧。
public List<String> restoreIpAddresses(String s) {
List<String> result = new ArrayList<>();
helper(s, 0, 0, result, "");
return result;
}
private void helper(String s, int n, int index, List<String> result, String s2) {
if (n == 3) {
if (isValid(s.substring(index, s.length()))) {
result.add(s2 + s.substring(index, s.length()));
}
return;
}
for (int i = index; i <= index + 2 && i + 1< s.length() ; i++) {
if(isValid(s.substring(index, i + 1))) {
helper(s, n + 1, i + 1, result, s2 + s.substring(index, i + 1) + ".");
}
}
}
private boolean isValid(String str) {
if (str == null || str.length() == 0 || str.length() > 3 ) return false;
if (str.length() > 1 && str.charAt(0) == '0') return false;
int number = Integer.parseInt(str);
if (number > 255) return false;
return true;
}
第一次的,简直是个渣,刚转行刷题半年左右时写的代码,简直不忍读. 过去这一年提高还是很多的。
public List<String> restoreIpAddresses(String s) {
if(s.length() > 12 || s.length() < 4) return new ArrayList<String>();
List<String> result = new ArrayList<String>();
for(int i = 1; i < 4; i ++ ) {
String s1 = s.substring(0, i);
if(s.length() - i > 9 || s.length() -i < 3) continue;
if(!isValid(s1)) continue;
StringBuilder sb = new StringBuilder();
sb.append(s1);
for(int j = 1; j < 4; j ++ ) {
if(j + i + 2 > s.length() ) continue;
if(j + i + 6 < s.length() ) continue;
StringBuilder sb2 = new StringBuilder();
sb2.append(sb.toString());
String s2 = s.substring(i, i +j);
if(!isValid(s2)) continue;
sb2.append(".");
sb2.append(s2);
for(int k = 1; k < 4; k ++) {
if(j + i + k + 1 > s.length() ) continue;
if(j + i + k + 3 < s.length() ) continue;
String s3 = s.substring(i+j, i + j + k);
if(!isValid(s3)) continue;
StringBuilder sb3 = new StringBuilder();
sb3.append(sb2.toString());
sb3.append(".");
sb3.append(s3);
String s4 = s.substring(i + j + k);
if(isValid(s4)) {
sb3.append(".");
sb3.append(s4);
result.add(sb3.toString());
}
}
}
}
return result;
}
private boolean isValid(String seg) {
if(seg.length() > 1 && seg.charAt(0) == '0') return false;
int a = Integer.parseInt(seg);
if(a < 0 || a > 255) return false;
return true;
}