从字符串对中查找未知的排列

时间:2017-02-09 03:10:05

标签: algorithm permutation graph-theory matching bipartite

假设我有一堆字符串对,表示“之前”和“之后”值。举一个简单的例子:

 aaaabbbb -> aabbbbaa
 abbbbbbb -> bbbbbbab
 aaabbbaa -> abbbaaaa
 cccccccc -> cccccccc

我如何确定一个可能的排列可能是[6,7,0,1,2,3,4,5],或者换句话说,所有字符都向左旋转了两个空格?

是否有一些关于这个问题的文献?此外,如果列表中的某些对不能准确匹配,是否存在“最有可能”排列的概念?除了向左和向右移动之外,还能找到更复杂的排列吗?

2 个答案:

答案 0 :(得分:1)

string rotation problem的一个常见解决方案是将原始字符串与自身连接起来,并检查测试字符串是否为子字符串。

例: abcd向左旋转两个cdab。 因此abcd与自身连接abcdabcd,注意cdab是子字符串。

我想要检测到它正好是左边两个旋转,你可以检查子串是否从第三个字符开始。您可能需要检查一些其他情况,以确认它不是另一个方向的旋转。

答案 1 :(得分:1)

您需要了解graph theorymatching的基本概念。

假设before的每个位置都是左节点,after的每个位置都是右节点。 对于左侧位置i和右侧位置j,连接从左侧节点i到右侧节点j的边缘,当且仅当x [i]等于所有对x -> y中的y [j]时。 然后问题变成找到这个二分图的完美匹配,这是一个解决的问题。

"最有可能"排列会更难,它需要确切定义"最有可能"。您想要尽可能多地满足吗?或者更喜欢匹配的字符?