今天聊一个递归解决二分字符串的问题。
问题:给定正整数 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'