NAIVE 解法,O(n3):
public List<String> restoreIpAddresses(String s) {
int len = s.length();
List<String> res = new ArrayList<>();
if (len < 4 || len > 12) return res;
// for (int i = 1; i < len - 2; i++)
// for (int j = i + 1; j < len - 1; j++)
// for (int k = j + 1; k < len; k++) {
// 加上j < i + 4这个条件可以少循环很多次
for (int i = 1; i < 4 && i < len - 2; i++)
for (int j = i + 1; j < i + 4 && j < len - 1; j++)
for (int k = j + 1; k < j + 4 && k < len; k++) {
if (isValid(s.substring(0, i))
&& isValid(s.substring(i, j))
&& isValid(s.substring(j, k))
&& isValid(s.substring(k, len))) {
String seg = s.substring(0, i) + "." + s.substring(i, j) + "." + s.substring(j, k) + "." + s.substring(k, len);
res.add(seg);
}
}
return res;
}
private boolean isValid(String s) {
if (s.length() > 3) return false;
if (s.length() > 1 && s.charAt(0) == '0') return false;
return Integer.parseInt(s) <= 255;
}
dfs
dfs解法我写了一个,我想的是类似Combination Sum那种的;但是运行时报错outOfRange -1。但是不知道哪里有错。而且,我不知道这个思路哪里有问题。递归还是难。先贴这儿:
public List<String> restoreIpAddresses(String s) {
int len = s.length();
List<String> res = new ArrayList<>();
if (len < 4 || len > 12) return res;
dfs(s, res, 0, 0, "");
return res;
}
private void dfs(String s, List<String> res, int count, int idx, String ans) {
if (count == 4 && idx == s.length() - 1) {
res.add(ans);
}
for (int i = idx; i < s.length(); i++) {
if (idx > s.length()) break;
if (!isValid(s.substring(i, idx + 1))) continue;
ans += s.substring(i, idx + 1);
dfs(s, res, ++count, ans.length(), ans);
}
}
private boolean isValid(String s) {
if (s.length() == 0 || s.length() > 3) return false;
if (s.length() > 1 && s.charAt(0) == '0') return false;
return Integer.parseInt(s) <= 255;
}
网友评论