长度为 2^k + k - 1 的 binary string,使其任意一个长度为 k 的 substring 都是唯一的
要求找出长度为 2^k + k -1
的 binary string,其任意一个长度为 k
的 substring 都是唯一的。
例如,当 k = 2
时,需要找到长度为 5
的 binary string,使其任意连续两位在整个 string 内是唯一的。满足条件的解共有 4 个:00110
、10011
、11001
、01100
。以 00110
为例,00
、01
、11
、10
都只出现了一次。
k = 3
时,就需要找到长度为 10
的 binary string,使其任意连续三位在整个 string 内是唯一的。一共有 16 个解,其中字典序最小一个是 0001011100
。k = 4
时,有 256 个解,其中字典序最小的一个是 0000100110101111000
。k = 5
时,有 65536 个解,其中一个是 000001000110010100111010110111110000
。
现在我想问的两个问题是:
1、有什么算法可以快速找出一个任意解,或是找出所有的解?
2、看起来似乎 k = n 时的解的数量是 k = n-1 时的解的数量的平方。但是能否证明?
十分感谢诸大神。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
关于计算字符串的问题,用了个比较笨的办法,思路:
下面是用Python做的代码,有兴趣的可以一起研究算法优化的办法。
直接用遍历就可以了吧?
要生成全部,就调用generatBitStringAll,只要生成部分,就只需要调用generatBitStrings
测试了一下,计算k为3,4,5时都没问题, 但是6就很慢,还有优化的空间
暂时没有证明问题2,但看起来是成立的
生成一个格雷码码表,其中任意连续2^k
<<即(2^k + k - 1) - (k - 1)
>> 个码字可以构成本命题的一个解。其他的自己发散思考吧……(以上内容理解有错)
2^k + k -1
长度的串,共有2^k
个substring。长度为k的string也就是2^k
个,所以每个string都要出现有且仅有一次。假设串的k-1前缀是s,串就是
sx
。我们有如下的顺序满足。sx->ys!x->!ys
,其中!x
表示x
取反,!y
同理。->
表示中间可能存在其它字符(不能有包含s前缀或者后缀的子串)。待续。。。