我需要计算包含“00”作为子字符串的可能子串。 我知道二进制字符串的长度。
例如:对于长度为4的字符串,可能的子字符串是: 0000 0001 0010 0011 0100 1000 1001 1100
我只需要可能的组合数量,而不是枚举所有组合
PS:最大长度10 ^ 6
答案 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< = i< = n)和s(j)
第一个j
数字的子串(i <= j&lt; n)。
s(n-1)
已包含“00”,则s(n)
也包含“00”,无论c[n]
是“0”还是“1”。因此,我们已经拥有符合条件的2 * count(n-1)
字符串。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)
个字符串。添加两者,我们得到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