如何计算与一组子集匹配的某些字符串的排列数?

How can I count the number of permutations of some string matching a set of subsets?

我有一个字符串S和一组S的排列子集,称为M。M的元素限制了S的允许排列。我想计算S的允许排列的数量。唯一的限制是M的允许元素是包含的子集对应于某些排列的开始或结束。

例如,假设 S='ABC' 和 M = {'AB', 'BC'}。因此,'ABC' 唯一允许的排列是 'ABC' 和 'CBA'。

我已经尝试从多个不同的方向来解决这个问题,但如果不枚举 S 的所有排列,我无法弄清楚如何解决它。任何人都可以提供任何见解吗?

利用Inclusion-exclusion principle.

在提供的示例中,它将是:

number of permutations that contain "AB" + number of permutations that contain "BC" - number of permutations that contain both "AB" and "BC"

你只需要实现一个函数来计算包含 all 给定子序列的排列数。

请注意,如果存在包含相同字母的子序列:

  • 您可以组合子序列,例如两个子序列 "ABCD" + "CDEF" -> 一个子序列 "ABCDEF"
  • 如果存在不匹配,则没有符合条件的排列。

一旦你得到了不同字母的子序列,结果就是阶乘(长度(S)-所有子序列的总长度+子序列的数量)。

您可以通过记住子集的组合子序列来优化它。

复杂度:2^|M| * (|S| + |M|)。