Algorithm 唯一排列-有例外

Algorithm 唯一排列-有例外,algorithm,permutation,Algorithm,Permutation,我刚做了个测验,有个问题是我强逼的。。。但我确信有一个“数学”公式可以“解决”它 字符串的排列 假设你有一个字符串“abcdef”。。。计算字符串的所有唯一排列。对于具有所有唯一选项的字符串,这很简单:长度因子。那么6!=720个独特的组合 唯一排列 现在,当您添加重复项时。。。取factoral,按唯一字母的乘积进行划分:“aaabb”=>6!/(3!*3!)=>720/36=>20种独特的组合 带有排除项的唯一排列 让我难堪的是: 您有一个字符串,可能有重复的数据。。。除了现在,请排除以空格

我刚做了个测验,有个问题是我强逼的。。。但我确信有一个“数学”公式可以“解决”它

字符串的排列

假设你有一个字符串“abcdef”。。。计算字符串的所有唯一排列。对于具有所有唯一选项的字符串,这很简单:长度因子。那么6!=720个独特的组合

唯一排列

现在,当您添加重复项时。。。取factoral,按唯一字母的乘积进行划分:“aaabb”=>6!/(3!*3!)=>720/36=>20种独特的组合

带有排除项的唯一排列

让我难堪的是:

您有一个字符串,可能有重复的数据。。。除了现在,请排除以空格(或圆点,用于可见性)开头的排列:

我的解决方案

我的解决方案-暴力-是创建排列。。。并手动排除那些以空格开头的。。。如果我没记错的话

我知道它与因子数和空格数有关。但最终的答案我想不起来


我应该可以计算长度除以计数。。。然后计算以空格开头的不同数字并减去它。

将第一个字符作为单独的大小写进行分区:该字符的选择较少。这将更改计算分子的第一个因子。例如,
aa.bb.cc
对于第一个字符只有6个选项,而不是8个。因此,计算结果是:

8! / (2! 2! 2! 2!)   -- four duplicates
现在是

(6 * 7!) / (2! 2! 2! 2!)   -- we still have four duplicates

假设你有5个独特的字母

那你就有5个了!组合

现在当你有5个独特的字母表和一个,然后

在第一个位置,您将放置这5个字母中的一个。然后,你将把剩下的(4个字母和1个)放在5中!方式,

结果是5*5

因此,我认为答案应该是

假设在所有和z空间中都有x个唯一字母,y个字母

所以答案应该是


y*(y+z-1)!/(
寻找重复的字母表和空格组合

只需减去第一个字符固定为“.”时的排列数即可(使用相同的逻辑,可以通过查看删除一个点后字符串的排列数来计算)
假设x唯一、y字符和z空格。。。。y*(y+z-1)!/(…)
-我假设有什么东西坏了。。。方程中没有X。。。我不认为它像贴出来的那样有效。你不需要方程@WernerCD中的X,引用你问题中的例子,`现在唯一的置换,当你添加重复项时。。。取factoral,按唯一字母的乘积进行划分:“aaabb”=>6!/(3!*3!)=>720/36=>20种独特的组合`
(6 * 7!) / (2! 2! 2! 2!)   -- we still have four duplicates