- 复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]
class Solution {
public List<String> restoreIpAddresses(String s) {
int len = s.length();
List<String> res = new ArrayList<>();
if(len < 4 || len > 12) return res;//最小值为4,即均为0,最大为12
dfs(res, s, len, 0, 0, new ArrayList<>());
return res;
}
void dfs(List<String> res, String s, int len, int index, int split, ArrayList<String> list){
if(split == 4 && len == index){//这里要同时满足两个条件
//list仍然用作缓存,可以利用String的join功能
res.add(String.join(".", list));
return;
}
//可以剪枝
if(len - index < 4 - split || len - index > 3*(4 - split)) return;//因为index从0开始,所以len - index即为长度
//对每一个进行分段,三种可能性,1,2,3个
for(int i = 0; i < 3; i++){
if(index + i >= len) break;
int seqment = splitSe(s, index, i + index);
if(seqment != -1){
list.add(seqment + "");
dfs(res, s, len, index + i + 1,split + 1, list);//index是表示要处理的位置,所以+1
list.remove(list.size() - 1);
}
}
}
int splitSe(String s, int left, int right){//用来判断截取的字符是否有效
// 大于 1 位的时候,不能以 0 开头
int len = right - left + 1;
if(len > 1 && s.charAt(left) == '0') return -1;//无效
int ans = 0;
for(int i = left; i <= right; i++){
ans = ans * 10 + (s.charAt(i) - '0');
}
if(ans > 255) return -1;
return ans;
}
}