力扣93. 复原IP地址 (java回溯+减枝)

力扣93:复原IP地址

力扣93. 复原IP地址 (java回溯+减枝)_第1张图片

回溯+减枝

注解清晰~~

class Solution {
    List<String> list = new ArrayList<String>();

    public List<String> restoreIpAddresses(String s) {
        //x.x.x.x  ip地址最少为4位,最多为12位
        if(s.length() < 4 || s.length() > 12){
            return list;
        }
        StringBuilder sb = new StringBuilder();
        int target = 0;
        for(int i=1;i<4;i++){
        	//若开头为0开头且位数大于1位  则直接结束循环,例如 01,不存在01.xx.xx.xx这样的ip地址
        	if(s.substring(0,i).charAt(0) == '0' && i != 1) {
        		break;
        	}
        	//String转成int,由此判断他的大小
            target = Integer.valueOf(s.substring(0,i));
            //约束条件,每个区间最长3位,最短1位
            if(target < 256 && s.length()-i > 2 && s.length()-i < 10){
                sb.append(target);
                sb.append('.');
                backTrack(sb,s,i,1);
                sb.setLength(0);
            }
        }
        return list;
    }
    public void backTrack(StringBuilder sb,String s,int start,int level){
        if(level > 4) {
    		return;
    	}
        if(start == s.length() && level == 4){
            list.add(sb.toString());
            return;
        }
        //剩余长度不符合接下来的运算,则减枝
        if(s.length()-start < 4-level || s.length()-start > (4-level)*3) {
        	return;
        }
        //控制循环次数
        int flag = 1;
        int target = 0;
        //区间自增
        level++;
        for(int i=start;i<s.length();i++){
        	if(s.substring(start,start+flag).charAt(0) == '0' && flag != 1) {
        		return;
        	}
            target = Integer.valueOf(s.substring(start,start+flag));
            flag++;
            if(target < 256){
                sb.append(target);
                //除了最后一个区间,加入对应字符串之后都需要在结尾加上 '.'
                if(level != 4){
                    sb.append('.');
                }             
                backTrack(sb,s,i+1,level);
                //这一步很关键,恢复状态需要考虑到新加入的'.',偏移值为level-1
                sb.delete(start+level-1,sb.length());
            }
            //循环次数最大为3次
            if(flag == 4){
                break;
            }
        }
    }
}

力扣93. 复原IP地址 (java回溯+减枝)_第2张图片

你可能感兴趣的:(力扣)