You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:非递归生成不含连续0的n位二进制字符串集合的实现问题

求助:非递归生成不含连续0的n位二进制字符串集合的实现问题

嗨,我看了你的代码和问题描述,咱们一步步来排查问题哈~

首先说你当前代码里的几个明显bug:

  1. 生成二进制串的循环逻辑错误:你在for num in list的循环里直接把list = temp_list,这会导致每次处理一个num就把原list替换成temp_list,后续遍历的num就不是最初的list里的元素了,生成的字符串长度会混乱。应该把list = temp_list移到for循环外面,等所有原list的元素都处理完再替换。
  2. 遍历列表时直接删除元素的坑:你在for num in list的时候调用list.remove(num),这会让迭代器出错,因为列表长度在变化,会跳过某些元素,导致漏删。比如当你删除第k个元素后,下一个迭代的是k+2个元素,k+1的就被跳过了。
  3. 过滤逻辑冗余且没必要:你循环k从2到n检查'0'*k,其实只要检查是否包含'00'就够了,因为更长的连续0肯定包含'00',多此一举反而可能引发问题。

先给你修正当前思路的代码(先全生成再过滤):

def bit_string(n):
    if n == 0:
        return set()
    # 初始化长度为1的二进制串,直接用字符串避免类型转换
    str_list = ['0', '1']
    i = 1
    while i < n:
        temp_list = []
        for s in str_list:
            temp_list.append(s + '1')
            temp_list.append(s + '0')
        # 处理完所有原串再替换列表
        str_list = temp_list
        i += 1
    # 用列表推导式过滤,避免遍历原列表时删除元素的问题
    filtered = [s for s in str_list if '00' not in s]
    return set(filtered)

print(bit_string(4))

不过其实,先生成全量再过滤的效率不高,尤其是n大的时候,全量是2^n个串,过滤会浪费资源。咱们可以直接在生成的时候就保证不生成含连续0的串,这样更高效,这也是非递归的最优思路:
我们可以维护一个列表,里面始终是当前长度符合要求的串。初始时n=1是['0','1'];对于每个后续的长度,我们对每个已有的串:

  • 如果串的最后一位是1,那么可以加0或1;
  • 如果串的最后一位是0,那么只能加1(避免连续0);
    这样直接生成符合条件的串,不用后续过滤,效率高很多。

代码实现:

def bit_string(n):
    if n == 0:
        return set()
    # 初始化长度为1的有效串
    valid_strs = ['0', '1']
    for _ in range(n-1):
        new_valid = []
        for s in valid_strs:
            # 不管最后一位是什么,加1肯定合法
            new_valid.append(s + '1')
            # 只有最后一位是1的时候,才能加0,避免出现连续0
            if s[-1] == '1':
                new_valid.append(s + '0')
        valid_strs = new_valid
    return set(valid_strs)

print(bit_string(4))

这个代码运行后会直接得到正确的集合,而且效率是O(F(n)),F(n)是斐波那契数(不含连续0的n位二进制串的数量正好是斐波那契数列:F(1)=2, F(2)=3, F(3)=5, F(4)=8...),比先生成全量再过滤高效太多。

另外提个小细节:不要用list作为变量名哦,这是Python的内置类型,会覆盖掉内置的list函数,容易引发奇怪的问题。

希望这些建议能帮到你,如果还有疑问随时问~

备注:内容来源于stack exchange,提问作者Gregory Varner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:03:01