<Leetcode>93. 复原地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
**输入: "25525511135" **
**输出: ["255.255.11.135", "255.255.111.35"] **
解析
这道题,暂时只能想到暴力解法:
**深搜+减枝 **
- 每次搜索,for循环,判断下面的分别判断之后的一位,两位,三位,要求不能数据越界以及那个一位数,二位数,三位数分别都在0 ~ 255 之间,如果发现不满足条件,马上return减枝
- 一个 ip 地址分成 4 部分,每次用 count 记录下已经轮数,表示已经到达第 count 部分,如果发现到达第5部分,就直接return 减枝
- 当到了第4部分的时候,如果发现,最后一个数的位置不是 数组的最末尾的字符,也return
- 如果到了第4部分,发现最后一个字符的位置刚好是数组最末尾的字符,就直接输出 List
直接上代码
public class Ip {
static String ip;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ip = sc.nextLine();
List<List> list = new ArrayList();
search(0, list, 1);
}
public static void search(int begin, List list, int count) {
//达到了第5次,直接return,因为ip地址不可能有5个部分
if(count == 5) {
return;
}
//从第一个字符到第3个字符
for(int i = begin; i <= begin+2 && i < ip.length(); i++) {
int newInt = Integer.parseInt(ip.substring(begin, i+1));
//判断合法性
if(newInt >= 0 && newInt <= 255) {
//如果到了第4部分,发现最后一个字符的位置刚好是数组最末尾的字符,就直接输出 List
if(count == 4 && i == ip.length()-1) {
List list1 = new ArrayList<Integer>();
for(int j=begin; j<=i; j++) {
list1.add(ip.charAt(j));
}
//如果合法,直接把值添加到 list 中
list.add(list1);
//分4次输出
list.forEach(e -> {
List a = (List)e;
a.forEach(f -> {
System.out.print(f);
});
System.out.print(",");
});
System.out.println("");
//还原 -> 然后删除最后一个list,
list.remove(list.size()-1);
return;
//再return
}
List list1 = new ArrayList<Integer>();
for(int j=begin; j<=i; j++) {
list1.add(ip.charAt(j));
}
list.add(list1);
//然后直接深搜count+1,深搜下一个部分
search(i+1, list, count+1);
//还原list的最初状态
list.remove(list.size()-1);
}else {
return;
}
}
}
}
还是比较简单的,如果有什么错误的地方,欢迎指正交流