[JavaScript 刷题] 搜索 - 复原 IP 地址, leetcode 93

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 搜索 - 复原 IP 地址, leetcode 93相关的知识,希望对你有一定的参考价值。

[javascript 刷题] 搜索 - 复原 IP 地址, leetcode 93

github repo 地址: https://github.com/GoldenaArcher/js_leetcode,Github 的目录 大概 会更新的更勤快一些。

题目地址:93. Restore IP Addresses

题目

如下:

A valid IP address consists of exactly four integers separated by single dots. Each integer is between 0 and 255 (inclusive) and cannot have leading zeros.

  • For example, "0.1.2.201" and "192.168.1.1" are valid IP addresses, but "0.011.255.245", "192.168.1.312" and "192.168@1.1" are invalid IP addresses.

Given a string s containing only digits, return all possible valid IP addresses that can be formed by inserting dots into s. You are not allowed to reorder or remove any digits in s. You may return the valid IP addresses in any order.

解题思路

其实这道题就和 电话号码的字母组合 很像了,当然,这里的边界条件比起 电话号码的字母组合 要稍微多一些。

  1. 必须使用整个字符串

    "25525511135" 为例,最初的几个遍历路线肯定是:

    2 5 2 25 5 55 511135 5511135 25511135

    注意这种路线:

    2 5 2 25 5 55 2 5 5

    虽然这些 IP 地址合法,但是不符合题意——题目中的需求要求必须使用全部的字符串,所以这些 IP 地址就违反了边界条件,也就不能被归入合法的 IP 地址中。

  2. 特殊值 0

    第二种边界条件就是每个 IP 包含的数字可以有 0,但是不能有 0 开头的,如 0.0.0.0 是一个合法的 IP 地址,但是 0.00.0.0 就不可以。

  3. 数字上限 255

    第三个边界条件为每个 IP 地址包含的数字上限为 255,取值范围是:[0, ..., 255],超过这个上限,如 256,也无法组成一个合法的 IP 地址。

本质上来说还是需要查遍所有的路径,这里需要几个额外的变量保存:

  1. 当前的字符串
  2. 已经添加多少个数字到 IP 中

一旦保存了这两个变量,那么用 DFS 去遍历所有的可能路径即可。

使用 JavaScript 解题

这道题解法不是我写出来的,而是在看别的大神写的时候看到的,原解法地址如下:JavaScript The Most Clean Backtracking Solution,真的很优雅。

/**
 * @param string s
 * @return string[]
 */
var restoreIpAddresses = function (s) 
  if (!s || s.length < 4 || s.length > 12) return [];

  const res = [];

  const isValidDigit = (str) => 
    if (+str > 255 || str.length === 0) return false;
    if (str.length > 1 && str[0] === "0") return false;

    return true;
  ;

  const dfs = (arr, str) => 
    if (arr.length === 3) 
      if (isValidDigit(str)) res.push([...arr, str]);
      return;
    

    for (let i = 0; i < 4; i++) 
      const currIP = str.slice(0, i);
      if (!isValidDigit(currIP)) continue;

      dfs([...arr, currIP], str.slice(i));
    
  ;

  dfs([], s);

  return res.map((ip) => ip.join("."));
;

解题思路中的图就是根据这个解法来的,充分利用 IP 地址的长度只能为 4 和传进来的值中只能包含数字的特性去解这道题。

以上是关于[JavaScript 刷题] 搜索 - 复原 IP 地址, leetcode 93的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题模版:91 - 100

LeetCode刷题模版:91 - 100

leetcode刷题分类笔记

leetcode刷题分类笔记

[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79

[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79