[JavaScript 刷题] 哈希表 - 检查一个字符串是否包含所有长度为 K 的二进制子串, leetcode 1461

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 哈希表 - 检查一个字符串是否包含所有长度为 K 的二进制子串, leetcode 1461相关的知识,希望对你有一定的参考价值。

[javascript 刷题] 哈希表 - 检查一个字符串是否包含所有长度为 K 的二进制子串, leetcode 1461

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

题目地址:1461. Check If a String Contains All Binary Codes of Size K

题目

如下:

Given a binary string s and an integer k, return true if every binary code of length k is a substring of s. Otherwise, return false.

解题思路

暴力解是肯定会超时的……

之前还看到一个解法,是使用 bit comparison 去解的,不过那个解法没太看懂,这里就提一下,希望有理解的大佬不吝赐教。

这里做法就是使用 Set 去做,题目中给的 hint 其实已经很明显了,只不过一下子没转过来:

  1. We need only to check all sub-strings of length k.

    只需要查找长度为 k 的子字符串

  2. The number of distinct sub-strings should be exactly 2^k.

    独特的子字符串的数量为 2^k 个

这道题就是这么理解的,以 k=2 为例,可以组成的字符串类型有:

  1. 00
  2. 01
  3. 10
  4. 11

这里就对应了 独特的子字符串的数量为 2^k 个,提示 1 也就变得非常明显了,鉴于题目中说数组中只会包含 0 或 1,那么只需要使用 Set 去保存所有长度为 2 的字符串,最后判断 Set 的长度与 独特的子字符串的数量为 2^k 个 是否相等即可。

使用 JavaScript 解题

/**
 * @param string s
 * @param number k
 * @return boolean
 */
var hasAllCodes = function (s, k) 
  const set = new Set();

  for (let i = 0; i < s.length - k + 1; i++) 
    set.add(s.substring(i, i + k));
  

  return set.size === Math.pow(2, k);
;

以上是关于[JavaScript 刷题] 哈希表 - 检查一个字符串是否包含所有长度为 K 的二进制子串, leetcode 1461的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 哈希表 - 两个数组的交集 II,leetcode 350

[JavaScript 刷题] 哈希表 - 存在重复元素, leetcode 217

[JavaScript 刷题] 哈希表 - 日志速率限制器, leetcode 359

[JavaScript 刷题] 哈希表 - 和为 K 的子数组, leetcode 560

[JavaScript 刷题] 哈希表 - 两个数组的交集 II,leetcode 350

[JavaScript 刷题] 哈希表 - 和为 K 的子数组, leetcode 560