• <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;
    			}	
    		}
    	}
    }
    
    
    

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

  • 相关阅读:
    2018上C语言程序设计(高级)作业-第0次作业
    最后一次作业-- 总结报告
    第14、15教学周作业
    第七周作业
    第六周作业
    第四周作业
    C语言--第四次作业
    C语言--第三次作业
    C-语言第二次作业(大一下)
    TRY
  • 原文地址:https://www.cnblogs.com/disandafeier/p/9853609.html
Copyright © 2020-2023  润新知