本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
有效 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()
}
}
}
};