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

时间:2015-02-03 19:38:41

标签: string algorithm set sequence permutation

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

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

我试过从多个不同的方向解决这个问题,并且无法弄清楚如何在不列举S的所有排列的情况下解决它。任何人都可以提供任何见解吗?

1 个答案:

答案 0 :(得分:1)

利用Inclusion-exclusion principle

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

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

您只需要实现一个函数,该函数计算包含所有给定子序列的排列数。

请注意,如果子序列包含的字母与:

相同
  • 您可以组合子序列,示例两个子序列“ABCD”+“CDEF” - >一个子序列“ABCDEF”
  • 如果不匹配,则没有符合标准的排列。

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

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

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