【问题标题】:Permutations of a string of non-unique characters一串非唯一字符的排列
【发布时间】:2023-03-12 09:36:01
【问题描述】:

虽然对于如何找到一串唯一字符的所有(唯一)排列有很多解决方案,但我还没有找到在字符不唯一时有效的解决方案。我在下面列出了我的想法,希望得到反馈,但也可以随时提供您自己的想法。

我的想法:

为了说明我的算法,我使用了字符串 ABBC 的示例,我想找到它的所有排列。由于有两个 B,我将它们标记为 B1 和 B2。

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

先前的研究:Prakhar 对这个 SO 问题的回答声称适用于重复:Generate list of all possible permutations of a string。可能,但我怀疑代码中存在错误。

【问题讨论】:

标签: string algorithm permutation


【解决方案1】:

怎么样:假设有重复的字符串长度为 N。现在考虑序列 0,1,...N-1。使用已知算法之一查找其所有排列。对于此列表中的每个排列,通过使用排列中的数字作为原始字符串的索引来生成相应的字符串。例如,如果字符串是 ABBC,那么序列将为 0,1,2,3; 0,1,3,2;等等。例如,序列 3,0,1,2 是排列之一,它产生字符串 CABB

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多