【问题标题】:Generate unique combinations of size N from an array of repeating characters从重复字符数组中生成大小为 N 的唯一组合
【发布时间】:2021-08-26 07:59:13
【问题描述】:

我有一个包含 重复 个字符的数组。拿 ['A','B','C','C'] 为例。我正在编写一个 C++ 程序来输出大小为 N 的所有组合。
当N = 2时,程序应输出AB、AC、BC和CC。
当N = 3时,程序应输出ABC、ACC、BCC。

我的方法是将数组中的每个字符视为唯一的。我生成了所有组合并将其保存到向量中。然后我遍历向量以删除重复的组合。
对于 N = 2,假设所有字符都是唯一的,则 4C2 = 6 种可能性:AB、AC、AC、BC、BC、CC。
1 AC 和 1 BC 被删除,因为它们出现两次而不是一次。

有没有更有效的方法来做到这一点?

注意:

  1. 数组中的字符不一定是升序。
  2. 在我最初的方法中,对向量使用 find() 不足以定位所有重复项。对于数组['T','O','M','O','R','R','O','W'],重复排列。对于 N = 4,其中两个重复项是 TOMO 和 TMOO。

【问题讨论】:

标签: algorithm combinations


【解决方案1】:

您可以对源数组进行排序并分组收集相似的项目。在下面的代码中,我添加了下一组开始的索引,以便在不使用下一个类似项目时正确跳转到下一组。

Python 代码和输出:

a = ['T','O','M','O','R','R','O','W']
a.sort()
print(a)
n = len(a)
b = [[a[-1], n]]
next = n
for i in range(n-2,-1, -1):
    if a[i] != a[i+1]:
        next = i + 1
    b.insert(0, [a[i], next])
print(b)

def combine(lst, idx, n, k, res):
    if len(res) == k:
        print(res)
        return
    if idx >= n:
        return

    #use current item
    combine(lst, idx + 1, n, k, res + lst[idx][0])
    #omit current item and go to the next group   
    combine(lst, lst[idx][1], n, k, res)

combine(b, 0, n, 3, "")

['M', 'O', 'O', 'O', 'R', 'R', 'T', 'W']
[['M', 1], ['O', 4], ['O', 4], ['O', 4], ['R', 6], ['R', 6], ['T', 7], ['W', 8]]

MOO     MOR    MOT    MOW    MRR    MRT    MRW    MTW
OOO    OOR    OOT    OOW    ORR    ORT    ORW    OTW
RRT    RRW    RTW

【讨论】:

    猜你喜欢
    • 2018-12-15
    • 1970-01-01
    • 2012-11-25
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多