93. 复原IP地址

2020-10-19
复原IP地址
 
/**
 * @param {string} s
 * @return {string[]}
 */
var restoreIpAddresses = function (s) {
  // 如果传入的字符串太长或者比255255255255还大 说明不可能有正常的IP
  if (s.length > 12 || Number(s) > 255255255255) return [];
  let ans = [];

  /**
   * 
   * @param {*} str 此次递归处理的字符串
   * @param {*} IP 暂时的一个IP的数组 每一项是ip的第0123项
   * @param {*} len 当前IP找到第几项了
   */
  const handle = (str, IP, len) => {
    // 如果剩下的字符串的长度 比 这个还长 说明字符串太多了 可以直接return出来
    // 例如:当前找到IP的第2项 str 如果还有7位 就不可能是合理的IP 因为剩下两项顶多有6位
    // 如果 str 已经为空字符串了 也直接return 
    // 例如找完10.10.2.3之后 紧接着会回到第2位把2变成23 然后找第3位 此时str已经是空 也就是 10.10.23.'' 这种情况如果不处理就会漏掉
    if (str.length > (4 - len) * 3 || !str) return;
    // IP的每一项都可能是 1-3 位的数
    for (let i = 0; i < 3; i++) {
      // 当在找第4位的IP的时候 如果有剩余str肯定是不行的 比如当前在找第4位 此时str='123' 
      // 当i=0时 第四位得到的值是1 但是str就还剩23多余 所以i!=1 应该找i=2或者i=3合不合适
      if (len === 3 && str.length - (i + 1) > 0) continue;
      // tmp 是此次 IP 第 len 项的值
      const tmp = str.slice(0, i + 1);
      // 如果 当前位的IP是3位 且比255大 直接return
      // 如果出现 01 011 这种 0 开头的 直接return
      if (Number(tmp) > 255 || (tmp.length > 1 && tmp[0] === '0')) return;
      // 重写IP的第len项 
      IP[len] = tmp;
      // 如果len已经等于3说明找到了完整合格的IP 放入ans中 如果str还有剩余是不可能走到这里的 在上面就return了
      if (len === 3) {
        ans.push(IP.join('.'));
        return;
      }
      // 如果len还不到3 那就继续往下找
      if (len < 3 && str.length) {
        // 注意 每次往下找 应该截取tmp之后的字符串作为下次的str
        handle(str.slice(i + 1), IP, len + 1);
      }
    }
  }

  handle(s, [], 0);
  return ans;
};

 


posted @ 2020-10-19 17:28  蓝小胖纸  阅读(117)  评论(0编辑  收藏  举报