二分字符串,没有连续的 1,使用递归思路,以及算法改进探讨

今天聊一个递归解决二分字符串的问题。

问题:给定正整数 N,计算所有长度为 N 但没有连续 1 的二分字符。比如, N = 2 时,输出为 【00,01,10】;当 N = 3 时,输出为 【000,001,010,100,101】

这个问题我在网上简单搜了一下,给出的方案是用遍历法,也就是把所有长度为 N 的二分字符枚举出来,再写逻辑来判断是否有连续的 1。这种方法很容易理解,但是需要枚举所有长度为 N 的二分字符的,计算时间就是 2 的 N 次方。我们可以使用递归的思路来解决这个问题。主要思路就是把该问题分解成子问题的组合,求解长度为 N 的二分字符,可以通过在长度为 N-1 但没有连续 1 的二分字符的基础上,每一个元素添加 0 或者 1 来得到。

假设存在一个函数能求得该问题的解,我们定义为 bina_noncontinous,那么我们能够得到当 N-1 时的所有没有连续 1 的二分字符。要求长度为 N 的解,我们只需在 N-1 的解中增加一位。增加的规则就是判断 N-1 时解的最后一位是否为 1 。因此,我们遍历 N-1 时的解,对于每一个元素,我们判断其最后一位,如果是 1 的话我们在其后增加一个 0,如果是 0 的话我们可以在其后增加一个 0 ,或者一个 1。遍历之后,新得到的元素则为参数为 N 时的解。下面是具体的代码

def bina_noncontinuous(N):
    if N <= 2:             #边界条件
        result = ['00', '01', '10']
    else:   # 思路:当 N-1 时,结果列表中存储的就是没有连续 1 的二分字串,增加一个长度时,我们只需要在之前数组元素中增加 0 或者 1
        result = bina_noncontinuous(N-1)     #递归
        n = len(result)
        result1 = []
        for i in range(0, n):        #遍历 N-1 中的所有元素
            if result[i][-1]== '0':
                a = result[i] + '0'
                b = result[i] + '1'
                result1.append(a)
                result1.append(b)
            else:
                if result[i][-1] == '1':
                    a = result[i] + '0'
       
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值