前端算法(57)

69 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

有效 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 中的任何数字。你可以按 任何 顺序返回答案。

输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

题目解析

思路一

首先我们定义backtrack函数,考虑backtrack需要什么的参数,这里我给了它两个参数,str字符串是每次递归时被截取剩下的字符串,path数组用来保存每次递归前压入的符合规则的字符串,既然是ipv4的地址。那么只要path的长度等于4时就可以考虑把path作为结果之一放入,但还需考虑一点,那就是str字符必须全部用完,即str === "",这样就完美满足题设条件,然后在每次path长度小于4时,我们需要考虑什么样的字符串符合规则,像以"0"开头且长度大于1(单个“0”是可以作为ip地址的一部分)的是不合题意的,比如“02”这种,这时候必须直接返回,不再往下递归,因为接下都是以“0”开头的字符

/**
 * @param {string} s
 * @return {string[]}
 */
var restoreIpAddresses = function(s) {
    const res = []
    backtrack(s,[])
    return res
    function backtrack(str,path){
        if(path.length === 4 && str === ""){
            res.push(path.join("."))
            return
        }
        for(let i = 1;i<=str.length;i++){
            if(str[0] === "0" && i>1){
                return
            }
            if(Number(str.slice(0,i))<=255){
                path.push(str.slice(0,i))
                backtrack(str.slice(i,str.length),path)
                path.pop()
            }
        }
    }
};