唯一排列 - 有例外

时间:2017-08-02 21:51:45

标签: algorithm permutation

我刚做了一个小测验,它有一个问题,我粗暴地被迫...但我确定有一个"数学" "解决"它

字符串的排列

假设您有一个字符串" abcdef" ...计算字符串的所有唯一排列。对于包含所有唯一选项的字符串,这很简单:Length Factoral。所以6! = 720种独特的组合。

唯一排列

现在,当你添加重复项时...你采取了一些事实,并且使用了独特字母的产品:" aaabbb" => 6! /(3!* 3!)=> 720/36 => 20种独特的组合。

唯一排列,有排除

困扰我的部分:

你有一个字符串,可能有重复的数据...除了现在,排除以空格开头的排列(或点,为了可见性):

"aa.bb" => "aabb." is a valid permutation... ".aabb" is not. 
"aa.bb.cc" => "aa..bbcc" valid permutation. ".aabbcc." not valid. "..aabbcc" is not valid
"a.." => has one valid permutation: "a.."... the others are all duplicates or start with spaces.

我的解决方案

我的解决方案 - 蛮力 - 是创建排列...并手动排除以空格开头的那些... O(N!)如果我没记错的话。

我知道这与事实和空格的数量有关。但最后的答案让我望而却步。

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

2 个答案:

答案 0 :(得分:1)

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

8! / (2! 2! 2! 2!)   -- four duplicates

现在是

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

答案 1 :(得分:1)

让我们说你有5个独特的字母,

所以你有5个!组合

现在,当你有5个唯一的字母和一个。时,

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

结果为5 * 5!

所以,根据我的答案应该是

让我们假设你有x个唯一的字母,y和所有和z空格中的字母

所以答案应该是

y *(y + z-1)! /(diving for repeated alphabets and spaces combinations