问题是找到长度为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(如n = 40),这种解决方案也不可行。
我考虑的第二种方法是: 1. 对于n的除数k,找到长度为k的所有子串,重复出现n/k次。 例如当n=6时,我们有除数1、2、3。对于长度为1,我们有两个子串“1”和“0”,它们分别重复出现6次,因此“111111”和“000000”是可重复的字符串;对于长度为2,我们有4个子串“00”、“01”、“10”、“11”,因此“000000”、“010101”、“101010”和“111111”是可重复的字符串;类似地,对于长度为3,有8个可重复的字符串。 2. 总结所有生成的字符串并减去重复项。
在上面的例子中,“111111”和“000000”每个除数都被计算了3次,所以很明显我计算的数量过多。我需要减去重复项,但我无法想到从实际计数中减去重复项的任何方法。我是否朝着正确的方向前进?还是需要其他方法?