如何找到排列满足以下条件的字符串的方法数量?

时间:2016-03-12 05:46:07

标签: combinations permutation combinatorics

我给了一个字符串,让我们说 - " abcd" 。 现在我必须通过置换其角色来找到所有可以生成的字符串 -

  
      
  1. 生成的字符串中只有四个不匹配,
  2.   
  3. 配对中存在不匹配,例如< - li>   

字符串 - &#34; abcd&#34; 有三种这样的排列 - 的&#34; BADC&#34; &#34; CDAB&#34; &#34; DCBA&#34;

解释 -

让我们考虑&#34; abcd&#34; &#34; badc&#34; 。现在恰好有四个不匹配,即 - (a,b)(b,a)(c,d),< strong>(d,c)并且这些不匹配存在于对中。

请注意&#34; abcde&#34; 有十五种这样的排列 - 的 acbed adebc aedcb baced badce baedc < /强>, cbaed cdabe ceadb dbeac dcbae decab ebdca ecbda EDCBA

我失败的地方? -

我只是手动找到字符串,但这对于长度较大的字符串来说非常耗时。因此,我需要一个有效的解决方案。

1 个答案:

答案 0 :(得分:1)

如果您的字符串长度nn个不同的字母组成,那么您找到的数字为:n * (n - 1) * (n - 2) * (n - 3) / 8

原因:有C(n, 4)种方式从4字母中选择n不匹配的位置,对于每个这样的四倍,有三种方法可以配对它们。

因此结果为C(n, 4) * 3 = n * (n - 1) * (n - 2) * (n - 3) / 8

这里的假设是字符串中的所有字母都不同。从您对问题的描述中不清楚字母是否可以重复。如果是这种情况,请对此答案发表评论。然后我会更新答案。

编辑:现在假设这些字母可以重复。情况更复杂。我会在这里给出草图。

我们假设该字符串包含m个不同的字母,分别发生a_1, ..., a_m次。另外,请为b_i编号C(a_i, 2)

有三种情况:

  • 案例1:四个不匹配形成两个相同的对,例如两个 a 和两个 b 被置换。

在这种情况下,我们有sum{b_i * b_j : 1 <= i < j <= m}个不同的字符串。这等于(sum{b_i}^2 - sum{b_i ^2}) / 2,这个表达式可以在O(m)时间内进行评估。

  • 案例2:四个不匹配包含三个不同的字母,例如一个 a 与一个 b 配对,另一个 a 与一个 c 配对。

在这种情况下,首先选择两对中常见的字母,让我们说它是i字母;然后必须选择另外两个字母。

为所有s的总和写a_i,并为所有t的总和写b_i。如果我们从剩余的s - a_i字母中选择两个任意字母,我们必须排除两个字母相同但具有t - b_i种可能性的情况。因此,有C(s - a_i, 2) - (t - b_i)种不同的方式来选择其他两个字母,因此b_i * (C(s - a_i, 2) - (t - b_i))个不同的字符串。对所有i求和,得出这种情况下不同字符串的总数。它仍然可以在O(m)时间内进行评估。

  • 案例3:四个不同的字母,例如一个一个和一个 b 形成一对,一个 c 和一个 d 形成另一对。

这个想法是一样的。首先,考虑从所有4个字母中选择s个任意字母的可能性。然后我们必须排除几个案例:

我。所有四个字母都相同,这有sum{C(a_i, 4)}个案例;

II。三个字母是相同的,第四个是不同的,这有sum{C(a_i, 3) * (s - a_i)}个案例;

III。两个字母是相同的,另外两个也是相同的,这正是案例1中计算的数字;

IV。两个字母是相同的,另外两个是不同的,这正是案例2中计算的数字。

因此,从所有s个字母中选择四个不同字母的可能性总数为:C(s, 4) - [i] - [ii] - [iii] - [iv]。和以前一样,这个数字应该乘以3以产生不同字符串的数量,因为每个四元组都会给3个不同的字符串。

总而言之,时间复杂度为O(m),这显然是最优的。