【问题标题】:No of Subsequences without duplicates没有重复的子序列数
【发布时间】:2020-01-15 07:44:54
【问题描述】:

我有一个特定长度的数组(比如 8 个)1,2,2,3,3,4,5,6

我希望找到这个长度数组的子序列数(比如 4)。这是 8 选择 4 (8C4) = 70。

但是,在上面 70 个子序列的列表中,我不想计算具有重复元素的序列,例如1223 1224 1334 2233 应该被删除。

我有一个解决方案可以解决单个元素的重复问题(即数组是 1,2,2,3,4,5,6,7)这里重复的元素是 2C2*6C2 = 15,需要的答案是 55

对于中等大小的数组大小和 len(最大十万)是否有通用公式/算法。对于一般情况,答案是以模格式计算的。

【问题讨论】:

  • @DavidEisenstat 这与您链接到的问题不同,因为它们对“不同”的定义不同。这计算了 *make& 一个没有重复的子序列的方法的数量。那个人计算了您可以从一个字符串中制作的不同子序列的数量,包括重复项。

标签: algorithm combinations subsequence


【解决方案1】:

这是一个简单的动态规划问题。

保留ways 的当前数量的数组,以在您的子序列中当前选择i 的元素。遍历这些值和计数,如果c 是某个特定值有多少的计数,那么以i 结束的方式的数量是没有这个值的方式,加上方式已经完成i-1 的次数已经是选择这个值的次数。

这是工作 Python 代码:

def count_distinct_subseq (seq, k, modulo=None):
    count = {}
    for s in seq:
        if s in count:
            count[s] = count[s] + 1
        else:
            count[s] = 1

    # # of ways to currently have i chosen.
    ways = [0 for i in range(k+1)]
    ways[0] = 1

    for s, c in count.iteritems():
        for i in range(k, 0, -1):
            ways[i] = ways[i] + ways[i-1] * c
            if modulo is not None:
                ways[i] = ways[i] % modulo

    return ways[k]

print(count_distinct_subseq([1, 2, 2, 3, 4, 5, 6, 7], 4))

传递第三个参数以对较小的参数进行模数计算。

【讨论】:

  • @DavidEisenstat 查看问题中描述的示例。它的措辞令人困惑,但 55 是获得不同子序列的方法数,而不是您可以获得的不同子序列的数量。同样,在您的示例中,您使用索引(0, 3), (1, 3), (2, 3) 获得了一个不同的子序列,因此答案 3 实际上是您获得不同子序列的方式的数量,即使您只能从中获得一个子序列。
  • 我在上面的评论中也指出了这一点,为什么这实际上不是您认为是重复的帖子的重复。
【解决方案2】:

这里是反复讨论的,用 JavaScript 编码的:

function f(A, k, i=A.length-1){
  if (k > i + 1 || k == 0)
    return [0, []]
    
  if (i == 0)
    return [1, [[[A[i]], 1]]]
    
  const [totalK, combsK] = f(A, k, i - 1)
  const [total, combs] = f(A, k - 1, i - 1)
   
  let newCombs = []
  let count = totalK
  
  for ([s, r] of combs){
    if (!s.includes(A[i])){
      let _s = s.slice()
      _s.push(A[i])
      count += r
      newCombs.push([_s, r])
    }
  }
  if (!newCombs.length && k == 1){
    newCombs = [[[A[i]], 1]]
    count += 1
  }
  return [count, combsK.concat(newCombs)]
}

var A = ["a", "a", "a", "b"]
console.log(JSON.stringify(f(A, 2)))

A = [1, 2, 2, 3, 4, 5, 6, 7]
console.log(JSON.stringify(f(A, 4)))

【讨论】:

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