题目描述
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。
当字符串长度小于4或者大于12时,返回[]
示例1:
输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]
解题思路:
使用递归求解:将数字依次拆成1位数、2位数和3位数进行组合,当剩余数字满足条件时,继续递归
// 参考大佬代码,关键点:数组深拷贝,检查传入方法字符串是否合法
var restoreIpAddresses = function(str) {
if(str.length<4||str.length>12) return []
let result = []
setItem(str,[],result)
return result
};
function setItem(str,tmp,result){
if(tmp.length == 3){
check(str)&&result.push([...tmp,str].join('.'))
return
}
for(let i = 1;i<4;i++){
check(str.slice(0,i))&&setItem(str.slice(i),[...tmp,str.slice(0,i)],result)//此处使用深克隆,防止影响到temp原始值
}
}
function check(str){
if(!str.length) return false
return 0<=+str&&+str<=255&&(str.length>1?str[0]!=0:true)
}
总结
(1) 字符串中的截取方法只有类似于数组slice()复制方法,但是都不会影响到数组本身;
截取方法1:slice()
跟数组slice()方法一样,slice(startIndex,endIndex)。复制出来的字符串包含start但是不包含endIndex
截取方法2: substring()
提取从 indexStart 到 indexEnd(不包括)之间的字符
(2)使用递归时最好不要使用固定变量,而是将变量作为值传入函数中,除非时返回值(类似于例子中的tmp)