链接数字与方程/算法

时间:2014-07-27 16:02:14

标签: vb.net algorithm visual-studio-2012 math anagram

我在Visual Basic中制作一个anagram解算器,在输入字符串时为您提供所有可能的组合。我需要计算出有多少种组合,具体取决于字符串中的字符数量以及有多少不同的字符。

  

E.G。

     

示例字符串:

     

ABC

     

总字符数:3,不同字符:3

     

可能的组合:6

     

abc,acb,bac,bca,cab,cba

我需要一个等式(使用字符数和不同的字符)将其链接到包含不同字符数量的字符串。 我一直在尝试使用反复试验来解决问题,但我无法理解它。到目前为止,我有:

  

((字母-1)^(不同字母-1))+(字母-1)

适用于几个不同的字母数,但现在适用于所有人。

请帮助???

2 个答案:

答案 0 :(得分:1)

我会引导您回答,但我会尝试解释。我们假设您有10个不同的字母。你有第一个10个选择,第二个有9个,第三个有8个等等。最终,会有10 * 9 * 8 * 7 * 6 ...... * 2 * 1 = 10!可能性。但是,有时您会有多个相同字母的实例。例如,将其用于字符串" aaabcd"会过度计算可能性,因为它将每个a都计为不同的字母,即使它们不是。要纠正这个问题,你必须除以重复字母数的阶乘。计算可能性总数的一种好方法是(字母总数),(每个字母重复实例数的阶乘的乘积)。

例如: 有6种!/(3!)方式来排列" aaabcd"
有6个!排列信件的方法是" abcdef"
有6种!/(3!* 2!)方式来排列" aaabbc"
有10个!/(5!* 3!* 2!)方式来排列" aaaaabbbcc"

我希望这会有所帮助。

答案 1 :(得分:1)

对于可能的计数,它与计算Multinomial Coefficient

完全相同

一个简单的解释是,对于没有重复的字符, 这只是排列= n! (如果你绘制一个树形图很容易理解,第一个字符有n个选项,第二个字符有n-1个选项......等等。)

但是,由于你可能有重复的字符,你将重复计算其中许多字符。

让我们看一个简单的例子:对于aaa,有多少可能的安排如果我们的结果是相同的那么? 答案是3!(aaa,aaa,aaa,aaa,aaa,aaa)

这让我们知道,当我们有一个字符显示m次时,我们会计算m!而不是1

所以计数只是n!(所有可能的安排,包括相同的结果)/ m!(一个字符出现m次)  对于重复的字符数相同:n!/a!b!c!..(第一个字符显示a次,另一个字符显示b次...)

如果您理解背后的概念,那么您会发现,实际上对于那些"非重复"字符,它只是划分1!。例如,字符(多)集= {a,a,a,b,b,c},#a = 3,#b = 2,#c = 1,所以答案(不重复计数)是(3+2+1)!/3!2!1!,此格式的一小部分是如上所述的多项式系数。

从编程的角度来看,你可以预先计算所有的阶乘(尽管n非常小n~30,因为declare frac = array(n); frac[0] = 1; FOR i=1; i<=n;i++ frac[i] = i*frac[i-1] 已经太大而无法存储变量),只需简单的for循环

n

对于较大的double/float,您可以在循环中动态计算DFS除法以避免溢出。但您可能会遇到精度问题。

如果您还需要输出不同的字符串,可以使用next_permutation()来回溯所有可能的结果。或者,如果您可以使用其他语言(如C ++),则可以在对字符集进行排序后使用{{1}}之类的内置函数。