String 非唯一字符字符串的排列

String 非唯一字符字符串的排列,string,algorithm,permutation,String,Algorithm,Permutation,虽然有很多解决方案可以找到一组唯一字符的所有(唯一)排列,但我还没有找到在字符非唯一时有效的解决方案。我已经在下面列出了我的想法,非常感谢您的反馈,但也可以随意提供您自己的想法 我的想法是: 为了说明我的算法,我使用了字符串ABBC的例子,我想找到它的所有排列。因为有两个B,我将给它们贴上B1和B2的标签 通过删除原始字符串中的所有重复字符创建新字符串(例如,将AB1B2C转换为AB1C) 查找新字符串的所有可能排列(例如AB1C、ACB1、B1AC等)。有很多算法可以做到这一点,因为字符串的字

虽然有很多解决方案可以找到一组唯一字符的所有(唯一)排列,但我还没有找到在字符非唯一时有效的解决方案。我已经在下面列出了我的想法,非常感谢您的反馈,但也可以随意提供您自己的想法

我的想法是:

为了说明我的算法,我使用了字符串ABBC的例子,我想找到它的所有排列。因为有两个B,我将给它们贴上B1和B2的标签

  • 通过删除原始字符串中的所有重复字符创建新字符串(例如,将AB1B2C转换为AB1C)
  • 查找新字符串的所有可能排列(例如AB1C、ACB1、B1AC等)。有很多算法可以做到这一点,因为字符串的字符都是唯一的
  • 选择一个重复字符。对于每个排列,在排列的每个“位置”插入所选的重复字符,除非重复字符前面的字符与重复字符具有相同的值(例如,对于置换AB1C,因为重复字符是B2,所以插入它以获得B2AB1C、AB2B1C、AB1CB2。例外:不要执行AB1B2C,因为这只是AB2B1C的重复)
  • 继续执行步骤3,但现在选择一个不同的重复字符。(执行此操作直到所有重复字符都被精确选择一次。)

  • 以前的研究:PrkHar在这个问题上的答案声称是重复的:它可能,但是我怀疑代码中有一个bug。

    如何:假设带重复的字符串是长度n。现在考虑序列0,1,…n-1。s list,使用排列中的数字作为原始字符串的索引生成相应的字符串。例如,如果字符串为ABBC,则序列将为0,1,2,3;0,1,3,2;等等。例如,序列3,0,1,2是其中一个排列,并生成字符串CABB

    下一个排列算法()可以处理非唯一字符。可能的重复