- 题目
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你不能重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
- 示例
输入:s = “25525511135”
输出:[“255.255.11.135”,“255.255.111.35”]
- 代码
class Solution {
List<String> res = new ArrayList<>();
StringBuilder cur = new StringBuilder();
// 如果有一个非0数前面有0或者数大于255则不合法
public boolean isValid(String s) {
if (s.charAt(0) == '0' && s.length() > 1) {
return false;
}
int num = Integer.valueOf(s);
if (num > 255) {
return false;
}
return true;
}
// index表示子串的起点,level表示第几个子串(level从0开始)
public void dfs(String s, int index, int level) {
int n = s.length();
// 如果已经截取了4个子串
if (level == 4) {
// 并且正好把字符串截取完
if (index == n) {
// 去掉最后的“.”
cur.setLength(cur.length() - 1);
res.add(cur.toString());
}
return;
}
// 截取子串,最长为3
for (int i = index; i < index + 3 && i < n; i++) {
String str = s.substring(index, i + 1);
if(isValid(str)) {
int length = cur.length();
cur.append(str);
cur.append(".");
dfs(s, i + 1, level + 1);
cur.setLength(length);
}
}
}
public List<String> restoreIpAddresses(String s) {
dfs(s, 0 , 0);
return res;
}
}