我有一个字符串S和一组S的排列子集,称为M.M的元素限制了S的允许排列。我想计算S的允许排列数。对允许的唯一限制M的元素是包含的子集对应于某些排列的开始或结束。
例如,假设S ='ABC'且M = {'AB','BC'}。因此,'ABC'唯一允许的排列是'ABC'和'CBA'。
我试过从多个不同的方向解决这个问题,并且无法弄清楚如何在不列举S的所有排列的情况下解决它。任何人都可以提供任何见解吗?
答案 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"
您只需要实现一个函数,该函数计算包含所有给定子序列的排列数。
请注意,如果子序列包含的字母与:
相同一旦你得到了不同字母的子序列,结果就是阶乘(长度(S) - 所有子序列的组合长度+子序列的数量)。
您可以通过记忆子集的组合子序列来优化它。
复杂性:2 ^ | M | *(| S | + | M |)。