字符串之间的排列数

时间:2014-06-04 00:08:27

标签: permutation

单词" BOOKKEEPER"。它的排序表示是" BEEEKKOOPR"如何在" BEEEKKOOPR"之间找到不同的单词排列。和" BOOKKEEPER"?

类似的例子:

对于" BBAA"

AABB - 1
ABAB - 2
ABBA - 3
BAAB - 4
BABA - 5
BBAA - 6

6 - 1 = 5所以在" BBAA"

之前有5个单词

" BEEEKKOOPR"将是1号。" BOOKKEEPER"会有一段距离。我不确定如何解决这个问题,因为我认为这是一个组合问题,而且我对这个问题没有多少经验。

1 个答案:

答案 0 :(得分:3)

如果您还没有,则必须了解词典顺序。

词典顺序是一种方式,单词的字母顺序是基于它们组成的字母的字母顺序。这方面的一个例子是字典中给出的单词顺序。例如,在字典中,单词" verification"出现之前"验证"。这是因为,两个单词中不同的第一个字母是第6个字母,因为' i'来之前' y'在字母表中,"验证"出现在"验证"。

之前

为了理解排列,我们可以将词典顺序看作一个递增的数字顺序,它与英文字母中的字母顺序字母相同。例如,字典顺序中的数字1,2和3的排列是123,132,213,231,312和321.类似地,你给出的例子,对于" BBAA",所有6个排列按字典顺序排列的A,A,B和B是:AABB,ABAB,ABBA,BAAB,BABA和BBAA。

字母B,E,E,E,K,K,O,O,P和R的所有排列,按字典顺序排列,将以" BEEEKKOOPR"并以" RPOOKKEEEB"结束。排列" BOOKKEEPER"将介于两者之间" BEEEKKOOPR"和#34; RPOOKKEEEB"。

简而言之,您提出的问题是在字典顺序中查找给定实体(字母或数字或具有明确定义的顺序的任何其他内容)的所有排列的问题。一千多年来,它一直是一个研究得很好的问题。有许多方法可以生成所有排列。如果您在网上搜索一段时间,您就会知道。我建议您阅读Donald Knuth撰写的“计算机编程艺术”#34;进行深入讨论。

一种经典算法基于在词典排序中找到下一个排列(如果存在),并继续这样做直到最后的排列。我从多伦多程序员那里找到了一个非常有用的算法,详见link。 Python提供了一些有用的函数来解决同样的问题。

回到你的例子,你所要做的就是从" BEEEKKOOPR"开始,这是字典顺序中的第一个排列,并继续按字典顺序查找下一个排列,直到你找到全部