力扣第93题 复原IP地址

题目描述

给定一个只包含数字的字符串,复原它并返回所有可能的 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值