计算可重复的长度为n的二进制字符串的数量

时间:2016-04-18 18:10:41

标签: string algorithm combinatorics counting

问题是找到长度为n的可重复二进制字符串的数量。二进制字符串是可重复的,如果它可以通过重复自身以形成原始二进制字符串的二进制字符串的任何子字符串获得。

Example
"1010" is a repeatable string as it can be obtained from "10" by repeating 2 number of times

"1001" is  not a repeatable string as it cannot be obtained from any sub string of "1001" by repeating them any number of times

我想到的解决方案是生成长度为n的所有可能的二进制字符串,并使用KMP算法检查它是否是可重复的,但是这个解决方案即使对于n = 40的小n也是不可行的。

我认为的第二种方法是

  1. 对于n的除数k,找到长度为k的所有子串,其重复自身n / k次
  2.   

    n = 6的例子我们有除数1,2,3

         

    对于长度1,我们有2个子串“1”和“0”重复自己6   所以“111111”和“000000”是可重复的字符串

         

    对于长度2,我们有4个子字符串“00”“01”“10”“11”所以“000000”   “010101”“101010”和“111111”是可重复的字符串

         

    类似于长度3,我们有8个可重复的字符串。

    1. 汇总所有除数生成的字符串并减去重复项。
    2. 在上面的例子中,每个除数的字符串“111111”和“000000”被计算了3次。显然我是在计数。我需要减去重复但是我无法想到从中减去重复我的实际数量我该怎么做?

      我是朝着正确的方向前进还是需要采取其他方法?

2 个答案:

答案 0 :(得分:1)

当您使用第二个方案时,删除由可重复二进制文件组成的子字符串。例如,00和11分别由0和1的重复组成。因此,对于2的长度,只考虑" 01"和" 10" 长度为3只考虑" 001"," 010"," 011"," 100"," 101" ," 110" ... 通常, 对于奇数长度的n,删除0和(2 ^ n)-1, 对于n的偶数长度,删除0,(2 ^(n / 2)+1),(2 ^(n / 2)+1) 2,....,(2 ^ n)-1 如果n可以被3分割,(1 + 2 ^(n / 2)+ 2 ^(n-2)),(1 + 2 ^(n / 2)+ 2 ^(n-2)) 2,...... 为所有分频器继续这个。

答案 1 :(得分:0)

一个想法是,如果我们只计算从非重复子串中产生除数大小的字符串的方法,则除数除数的计数将解释从重复子串中除数的方法。< / p>

f(1) = 0
f(n) = sum(2^d - f(d)), where 1 <= d < n and d divides n

...意味着n除数的方式的总和不能来自重复的子串。

f(2) = 2^1-0
f(3) = 2^1-0
f(4) = 2^1-0 + 2^2-2
f(6) = 2^1-0 + 2^2-2 + 2^3-2
...