[路飞]_93. 复原 IP 地址

「这是我参与2022首次更文挑战的第39天,活动详情查看:2022首次更文挑战

93. 复原 IP 地址

题目

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

  • 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "[email protected]" 是 无效 IP 地址。

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

示例1

输入: s = "25525511135"
输出: ["255.255.11.135","255.255.111.35"]
复制代码

示例2

输入: s = "0000"
输出: ["0.0.0.0"]
复制代码

示例3

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

提示

  • 1 <= s.length <= 20
  • s 仅由数字组成

题解

回溯

本题思路可参考

上述3题同样可以是递归回溯思想;

下面的递归回溯思想的伪代码

dfs();

function dfs(){
    if(终止条件) return 
    
    for(当前层所有可能的条件){
        if(符合要求的条件){
        
            // 继续递归
            dfs()
        }
    }
}
复制代码

根据伪代码或者成为套路代码,咱们带入条件解决本题;

第一步

  • 获取字符串长度
  • 声明 r e s u l t result 存储答案
  • d f s dfs
var restoreIpAddresses = function(s) { 
    const len = s.length
    const result = [];
    dfs();
    function dfs(){
    
    }
};
复制代码

第二步

  • d f s dfs 参数,需要两个,一个记录已经找到的IP,一个记录找下一个IP需要的起始位置
  • 已经找到的IP放在数组中,初始下一个IP需要的起始位置是0;
  • 终止状态, p a t h . l e n g t h > 4 path.length > 4 放弃吧,IP不可能超过4位,可以理解吧?
  • p a t h . l e n g t h = = = 4 path.length === 4 可能找到一个完成IP。后面的放弃吧
var restoreIpAddresses = function(s) { 
    const len = s.length
    const result = [];
    dfs(0,[]);
    function dfs(level,path){
        if(path.length > 4) returnif (path.length === 4) return;
    }
};
复制代码

第三步

  • for循环区间 [ 1 , 4 ) [1,4) 因为每个IP最多只有3位;
  • 从起始位置开始,在 [ 1 , 4 ) [1,4) 区间切割字符串 s s ;
  • 判断切割得到的字符串是否符合条件,符合条件的继续递归,
var restoreIpAddresses = function(s) { 
    const len = s.length
    const result = [];
    dfs(0,[]);
    function dfs(level,path){
        if(path.length > 4) returnif (path.length === 4) return;
        
        for(let i = 1 ; i < 4 ; i++){
            const t = s.substring(level,level+i)
            
            if(check(t)){
                path.push(path)
                dfs(level+i,path)
                path.pop()
            }
            
        }
    }
    function check(string){}
};
复制代码

条件

  • 字符串不能是0开头
  • 字符串不能大于225
  • 不符合两个条件的字符串,放弃递归
function check(string) {

    if (string[0] === '0' && string.length > 1) return false;
    if (Number(string) > 255) return false;
    return true;
 }
复制代码

根据上述思路编辑代码如下:

var restoreIpAddresses = function (s) {
  const len = s.length;
  const result = [];
  // dfs第一个参数表示步进值,第二个参数存放IP
  dfs(0, []);
  return result;
  function dfs(level, path) {
    if (path.length > 4) return;
    if (path.length === 4 && level === len) {
      result.push(path.join('.'));
      return;
    }

    for (let i = 1; i < 4; i++) {
      if (level + i > len) return;
      const t = s.substring(level, level + i);
      if (check(t)) {
        path.push(t);
        dfs(level + i, path);
        path.pop();
      }
    }
  }
  function check(string) {
    if (string[0] === '0' && string.length > 1) return false;
    if (Number(string) > 255) return false;
    return true;
  }
};
复制代码

结语

作者水平有限,如有不足欢迎指正;任何意见和建议欢迎评论区浏览讨论

猜你喜欢

转载自juejin.im/post/7068543317541126181
今日推荐