我需要比较二进制字符串,但如果一个是另一个的循环移位,我认为它们是相同的。例如,我需要以下内容:
10011, 11100, 01110, 11001
我认为以规范的方式存储它们更容易,只需检查等效性。要比较的所有字符串具有相同的长度(可能超过100位),因此我将保持长度不变,并将规范形式定义为我们可以从循环移位获得的最小二进制数。例如,00111
是上面显示的二进制字符串的规范形式。
我的问题是,给定一个二进制字符串,如何循环移位以获得最小的二进制数而不检查所有可能的移位?
如果其他代表更好,我很乐意收到建议。
我补充说,翻转字符串也无所谓,因此010011
的规范形式为001101
(如上所述)但如果允许翻转,规范形式应该是001011
(我更喜欢)。一种可能的解决方案是计算字符串和翻转字符串的标准化并选择较小的字符串。
如果它有帮助,我在MATLAB中使用二进制向量,但不需要代码,解释这种方法就足够了,谢谢!
答案 0 :(得分:1)
找到0的最长序列,如果> 1班,直到第一个是msb。
oops edge case将是00100,所以如果你有两个相等的最长零序列,你也希望唯一可能的1作为lsb。
找到最长的1s序列,如果> 1班直到最后是lsb
如果没有连续的1或0移位,直到lsb为1
那说它只有五个班次,所以你知道的蛮力方式可以轻松减少工作......