【发布时间】:2016-08-10 14:59:25
【问题描述】:
问题是求长度为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,这种解决方案也不可行。
我认为的第二种方法是
- 对于 n 的除数 k,找到所有长度为 k 且重复 n/k 次的子字符串
例如 n = 6 我们有除数 1,2,3
对于长度 1,我们有 2 个重复的子字符串“1”和“0” 6 所以“111111”和“000000”是可重复的字符串
对于长度 2,我们有 4 个子字符串 "00" "01" "10" "11" 所以 "000000" "010101" "101010" 和 "111111" 是可重复的字符串
对于长度为 3 的类似,我们有 8 个可重复的字符串。
- 将所有除数生成的字符串相加并减去重复项。
在上面的例子中,字符串“111111”和“000000”对于每个除数都被计算了 3 次。所以很明显我是在计数。我需要减去重复项,但无论如何我都想不出从中减去重复项我的实际计数我该怎么做?
我是朝着正确的方向前进还是需要采取其他方法?
【问题讨论】:
-
您当前的方法对我来说看起来不错。要弄清楚如何避免两次计算字符串,最好查看(例如 Wikipedia 文章)Inclusion-Exclusion Principle。
标签: string algorithm combinatorics counting