假设我有一堆字符串对,表示“之前”和“之后”值。举一个简单的例子:
aaaabbbb -> aabbbbaa
abbbbbbb -> bbbbbbab
aaabbbaa -> abbbaaaa
cccccccc -> cccccccc
我如何确定一个可能的排列可能是[6,7,0,1,2,3,4,5],或者换句话说,所有字符都向左旋转了两个空格?
是否有一些关于这个问题的文献?此外,如果列表中的某些对不能准确匹配,是否存在“最有可能”排列的概念?除了向左和向右移动之外,还能找到更复杂的排列吗?
答案 0 :(得分:1)
string rotation problem的一个常见解决方案是将原始字符串与自身连接起来,并检查测试字符串是否为子字符串。
例:
abcd
向左旋转两个cdab
。
因此abcd
与自身连接abcdabcd
,注意cdab
是子字符串。
我想要检测到它正好是左边两个旋转,你可以检查子串是否从第三个字符开始。您可能需要检查一些其他情况,以确认它不是另一个方向的旋转。
答案 1 :(得分:1)
您需要了解graph theory和matching的基本概念。
假设before
的每个位置都是左节点,after
的每个位置都是右节点。
对于左侧位置i和右侧位置j,连接从左侧节点i到右侧节点j的边缘,当且仅当x [i]等于所有对x -> y
中的y [j]时。
然后问题变成找到这个二分图的完美匹配,这是一个解决的问题。
"最有可能"排列会更难,它需要确切定义"最有可能"。您想要尽可能多地满足吗?或者更喜欢匹配的字符?