这题其实就是91. 解码方法的一个变型。解法完全一样。
dfs(int k, int p, String s, Stack
注意下约束关系,去处理就好了
class Solution {
public List<String> restoreIpAddresses(String s) {
if ("".equals(s)) return new ArrayList<>();
List<String> ans = new ArrayList<>();
Stack<String> cur = new Stack<>();
dfs(s.length(), 4, s, cur, ans);
return ans.stream().distinct().collect(Collectors.toList());
}
public void dfs(int k, int p, String s, Stack<String> cur, List<String> ans) {
if (k == 0 && p == 0) {
StringBuilder tmp = new StringBuilder();
for (int i = 0; i < cur.size() - 1; i++) {
tmp.append(cur.get(i)).append(".");
}
tmp.append(cur.peek());
ans.add(tmp.toString());
return;
}
//如果剩下的数太长
if (p * 3 < k) return;
//如果剩下的数太短
if (p > k) return;
for (int i = 1; i <= 3; i++) {
if (i == 1) {
cur.push("" + s.charAt(s.length() - k));
dfs(k - 1, p - 1, s, cur, ans);
if (!cur.isEmpty()) cur.pop();
// 注意,首位不能是0,像这种01.01.01.01是不可以的
} else if (i == 2 && k > 1 && s.charAt(s.length() - k) != '0') {
cur.push("" + s.charAt(s.length() - k) + s.charAt(s.length() - k + 1));
dfs(k - 2, p - 1, s, cur, ans);
if (!cur.isEmpty()) cur.pop();
} else if (i == 3 && k > 2 && s.charAt(s.length() - k) != '0') {
// 只允许<=255
String sub = s.substring(s.length() - k, s.length() - k + 3);
int tmp = Integer.parseInt(sub);
if (tmp <= 255) {
cur.push(sub);
dfs(k - 3, p - 1, s, cur, ans);
if (!cur.isEmpty()) cur.pop();
}
}
}
}
}