我刚做了一个小测验,它有一个问题,我粗暴地被迫...但我确定有一个"数学" "解决"它
字符串的排列
假设您有一个字符串" 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!)如果我没记错的话。
我知道这与事实和空格的数量有关。但最后的答案让我望而却步。
我应该能够取长度,除以计数......然后计算以空格开头并减去它的不同数字。
答案 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
)