【发布时间】:2012-02-09 20:00:34
【问题描述】:
通过众所周知的 Steinhaus-Johnson-Trotter 算法查找字符串的所有排列。但是如果字符串中包含重复的字符,例如
AABB,
那么可能的唯一组合将是 4!/(2!* 2!) = 6
实现这一点的一种方法是我们可以将它存储在一个数组中,然后删除重复项。
有没有更简单的方法来修改约翰逊算法,这样我们就不会生成重复的排列。 (以最有效的方式)
【问题讨论】:
-
排列的定义是什么? BA 是 AABB 的有效排列吗?
-
no BA 不是 AABB 的有效排列。
-
排列是对字符串中的字符进行洗牌的一个序列。对于长度为 n 和唯一字符的字符串,我们总共有 n 个!可能的独特排列
-
您可以修改 Jhonson 算法,将每个字母的每次出现放在一个步骤中。
-
如果您找不到避免生成重复项的方法,您可能会在生成重复项时通过将排列存储在自平衡 BST 或类似的排序结构中而受益于删除重复项。跨度>
标签: c algorithm combinatorics