1.题目:

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。 给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。


示例 1:

输入:s = "25525511135" 输出:["255.255.11.135","255.255.111.35"]

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/restore-ip-addresses 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。



2.代码:

class Solution {
    List<String> result = new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        if(s.length()>12) return result;//也算是剪枝了
        backTrack(s,0,0);
        return result;

    }
    //
    public void backTrack(String s,int startIndex,int pointNum){
        if(pointNum==3){//当逗点的数量是3时,就满足了条件
            if(isValid(s,startIndex,s.length()-1)){//这里也要判断第四段字符串是否合法,合法就放进集合中
                result.add(s);
            }
            return ;
        }
        for(int i=startIndex;i<s.length(); i++){
            if(isValid(s,startIndex,i)){//判断当前遍历到的字符串是否符合条件
                s=s.substring(0,i+1)+"."+s.substring(i+1);//在字符串后面增加逗点
                pointNum++;//逗点自增
                backTrack(s,i+2,pointNum);//递归,注意是i+2,因为已经增加了逗点
                pointNum--;//逗点回溯
                s=s.substring(0,i+1)+s.substring(i+2);//回溯删掉逗点
            }else{
                break;
            }
        }
    }
    //判断字符串再左闭右闭区间组成的数字是否合法
    public boolean isValid(String s,int start,int end){
        if(start>end) return false;
        if(s.charAt(start)=='0' && start!=end) return false;
        int num = 0;
        for(int i=start; i<=end; i++){
            if(s.charAt(i)>'9' || s.charAt(i)<'0') return false;
            num=num*10+(s.charAt(i)-'0');//把字符串变成整数的方法
            if(num>255) return false;
        }
        return true;
    }
}