【JS每日一算法】🟨87.复原 IP 地址(递归回溯)

524 阅读1分钟

有效 IP 地址 正好由四个整数(每个整数位于 0255 之间组成,且不能含有前导 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.length <= 20
  • s 仅由数字组成  

示例 1:

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

示例 2:

输入:s = "0000"
输出:["0.0.0.0"]

题解:

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: 递归回溯   TC:O(2^n)  SC:O(n)
 * @author: JunLiangWang
 * @param {*} s 给定字符串S
 * @return {*}
 */
function recursionBackTracking(s)
{
    /**
     * 该方案使用递归回溯,对字符串进行1到3个字符分隔,并进行搜索,
     * 最后筛选出满足要求的作为答案。
     */

    // 输出数组
    let outArray=[]
    /**
     * @description: 递归
     * @author: JunLiangWang
     * @param {*} index     当前字符串位置
     * @param {*} selectStr 已经选择的子串数组
     * @return {*}
     */    
    function recursion(index,selectStr){
        // 如果已经选择了4个子串
        if(selectStr.length==4){
            // 如果刚好将字符串分割为4个子串,证明能复原IP地址,添加结果
            if(index==s.length)outArray.push(selectStr.join('.'));
            // 如果分割后还存在字符,证明无法复原,舍去
            else return;
        }
        // 如果当前索引已经超出数组范围,则直接return
        if(index>=s.length)return 

        // 三种切割长度截取字符串
        for(let i=1;i<=3;i++){
          // 获得三种切割长度的字符串
          let preString=s.slice(index,index+i)
          // 判断是否满足IP单个片段的要求
          if((i>1&&preString[0]!='0'&&preString*1<256)||i==1){
              // 满足则继续递归
              recursion(index+i,[...selectStr,preString])
          }
        }
    }
    // 执行递归
    recursion(0,[],0)
    // 返回结果
    return outArray
}

来源:力扣(LeetCode)

🚀广告

最近开了一个新专栏《HTTP完全注解》,准备全面介绍下HTTP/0.9到HTTP/2.0。如果你想要全面学习了解HTTP,不妨看看,绝对会给你惊喜!