子串能表示从 1 到 N 数字的二进制串

标签: 字符串

难度: Medium

给定一个二进制字符串 s 和一个正整数 n,如果对于 [1, n] 范围内的每个整数,其二进制表示都是 s子字符串 ,就返回 true,否则返回 false 

子字符串 是字符串中连续的字符序列。

示例 1:

输入:s = "0110", n = 3
输出:true

示例 2:

输入:s = "0110", n = 4
输出:false

提示:

  • 1 <= s.length <= 1000
  • s[i] 不是 '0' 就是 '1'
  • 1 <= n <= 109

Submission

运行时间: 28 ms

内存: 16.0 MB

class Solution:
    def queryString(self, s: str, n: int) -> bool:
        return all(bin(i)[2:] in s for i in range(1, n + 1))

Explain

该题解使用了一个直接而有效的方法,利用 Python 的 all() 函数和字符串的 in 操作符来判断每个在1到n范围内的整数的二进制表示是否为给定字符串 s 的子字符串。对于每个 i 从 1 到 n,我们将 i 转换成它的二进制表示(通过 bin(i)[2:] 获取,去掉前缀 '0b'),并检查这个二进制字符串是否存在于 s 中。

时间复杂度: O(n*m*log(n))

空间复杂度: O(m)

class Solution:
    def queryString(self, s: str, n: int) -> bool:
        # 使用 all 函数检查是否所有从 1 到 n 的整数的二进制表示都是 s 的子字符串
        return all(bin(i)[2:] in s for i in range(1, n + 1))
        # bin(i)[2:] 转换整数 i 为二进制字符串,切片 [2:] 去除前缀 '0b'
        # 'in s' 检查生成的二进制字符串是否为 s 的子字符串

Explore

对于非常大的n值,如接近10^9,这种方法的执行效率将极为低下。首先,该算法需要对从1到n的每一个整数生成二进制字符串,然后检查这个字符串是否存在于给定的字符串s中。随着n的增大,总的运算次数和时间复杂度也线性增加。此外,字符串的'in'操作在最坏情况下的时间复杂度是O(m*n),其中m是字符串s的长度。因此,当n非常大时,这种方法将需要处理大量的数据和进行大量的检查操作,可能导致执行时间非常长,效率低下。

Python的all()函数是一个高效的内置函数,用于检查可迭代对象中的所有元素是否都满足某个条件。总体性能取决于传给all()的迭代器中的单个元素检查所需的时间。在本题的场景中,all()函数内部遍历的是一个生成器表达式,它为每个从1到n的整数生成二进制字符串并检查该字符串是否为s的子字符串。如果n很大,这个检查过程变得非常耗时,因此all()函数需要等待每个迭代步骤完成,可能导致整体性能下降。总的来说,在处理大量数据时,all()函数的性能主要受限于单次操作的复杂度和数据总量。

在二进制字符串s中如果存在大量重复的子字符串,这种算法的性能可能会受到两方面的影响。一方面,如果重复的子字符串正是需要检查的二进制数,这可能加速检查过程,因为更早地在字符串s中找到匹配项。另一方面,如果s中包含大量并非必须检查的重复子字符串,则可能会增加不必要的搜索时间,尤其是当使用字符串的'in'操作符进行子字符串搜索时,需要对s进行较多次的遍历和比较。因此,性能的具体影响取决于重复子字符串的内容以及它们与需要检查的二进制数的匹配程度。