93. 复原IP地址

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。
示例:
输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]

解题思路:回溯法+剪枝

class Solution {
//255.255.110.113
//一共四段,,,每段有3个数字,并且数字要小于255,,,回溯法

    List<String> res = new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        if(s.length()<4 || s.length()>12) return res;
        List<String> list = new ArrayList<>();
        backtrack(s,0,list);
        return res;
    }
    
    //list:当前分了几片了,一共4片,,每片最多三个数字,且小于255
    private void backtrack(String str,int start,List<String> list){
    //这里地start是从0开始地。list代表分片地个数,一共可以分为4个,所以list.size=4地时候就可以加入到res中了,但是还有一个条件,就是全部地数字都已经遍历完了,并且都符合地才可以加入地。。
        if(list.size()==4){
        //必须全部都遍历完成。==str.length(),没有-1,是因为最后一个也要加进去地。
            if(start==str.length()){
                res.add(String.join(".", list));//[[255,255,110,223]]-->["255.255.110.223"],很强大地一个API。
            }
        }

        for(int i=1;i<=3;i++){
            if(start+i > str.length()){
                break;
            }
			//截取,进行比较
			//有一种0X开头地不符合条件地,,所以如果是0开头并且长度大于1地,不符合条件,必须就要是0.0.0.0这种,所以要判断一下segment.startWith("0")&&segment.length()>1就是不符合条件地!!!
            String segment = str.substring(start,start+i);
            if(segment.startsWith("0") && segment.length()>1 || (i==3 && Integer.valueOf(segment)>255)){
                continue;
            }
            //回溯法~
            list.add(segment);
            backtrack(str,start+i,list);
            list.remove(list.size()-1);
        }
    }
   
}

你可能感兴趣的:(leetcode)