<Leetcode>93. 复原地址

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

示例:
**输入: "25525511135" **
**输出: ["255.255.11.135", "255.255.111.35"] **

解析

这道题,暂时只能想到暴力解法:
**深搜+减枝 **

  1. 每次搜索,for循环,判断下面的分别判断之后的一位,两位,三位,要求不能数据越界以及那个一位数,二位数,三位数分别都在0 ~ 255 之间,如果发现不满足条件,马上return减枝
  2. 一个 ip 地址分成 4 部分,每次用 count 记录下已经轮数,表示已经到达第 count 部分,如果发现到达第5部分,就直接return 减枝
  3. 当到了第4部分的时候,如果发现,最后一个数的位置不是 数组的最末尾的字符,也return
  4. 如果到了第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;
			}	
		}
	}
}


还是比较简单的,如果有什么错误的地方,欢迎指正交流

posted @ 2018-10-25 23:24  第三大费尔  阅读(105)  评论(0编辑  收藏  举报