如何计算没有。包含子串“00”的二进制字符串?

时间:2013-08-13 15:46:01

标签: c string binary

我需要计算包含“00”作为子字符串的可能子串。 我知道二进制字符串的长度。

例如:对于长度为4的字符串,可能的子字符串是: 0000 0001 0010 0011 0100 1000 1001 1100

我只需要可能的组合数量,而不是枚举所有组合

PS:最大长度10 ^ 6

2 个答案:

答案 0 :(得分:0)

这是使用斐波那契n步数序列计算的。

长度为n的字符串中包含k 0的字符串排列数为2 ^ n-fibk(n + 2)。

在你的情况下你有k = 2所以你使用正常的斐波那契序列给你解决你的例子,字符串长度n = 4:2 ^ 4 - fib(6)= 16 - 8 = 8。 / p>

编辑:见:http://mathworld.wolfram.com/Fibonaccin-StepNumber.html

答案 1 :(得分:0)

我想我可以给你一个算法的想法:

count(n)为字符串长度n的包含“00”的可能子串的数量。

我们现在检查大小为s(n)的字符串n(n> 3)。设c[i]为其数字(1&lt; = i&lt; = n)和s(j)第一个j数字的子串(i <= j&lt; n)。

  1. 如果s(n-1)已包含“00”,则s(n)也包含“00”,无论c[n]是“0”还是“1”。因此,我们已经拥有符合条件的2 * count(n-1)字符串。
  2. 如果s(n-1)不包含“00”,但s(n)不包含“{1}},那么s(n-1)必须以”0“结尾(因此c[n-1]必须为”0“)并且c[n]必须为“0”。由于c[n-1] = "0"c[n-2] 必须为“1”(否则s(n-1)将以“00”结尾)。所以我们知道s(n-1)以“10”结尾。 s(n-3)(在“10”之前的子字符串!)可以是任何不包含“00”的字符串,并且有2^(n-3) - count(n-3)个字符串。
  3. 添加两者,我们得到count(n) = 2*count(n-1) + 2^(n-3) - count(n-3)

    我们知道count(1)= 0(因为字符串太短),count(2)= 1(00)和count(3)= 3(000,001,100)。所以我们可以开始迭代,让我们尝试n = 4(你已经有了结果):

    count(4) = 2*count(3) +2^1 - count(1) = 2*3 + 2 - 0 = 8