我给了一个字符串,让我们说 - " abcd" 。 现在我必须通过置换其角色来找到所有可以生成的字符串 -
- 生成的字符串中只有四个不匹配,
- 配对中存在不匹配,例如< - li> 醇>
字符串 - &#34; abcd&#34; 有三种这样的排列 - 的&#34; BADC&#34; ,&#34; CDAB&#34; ,&#34; DCBA&#34; 。 p>
解释 -
让我们考虑&#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
我失败的地方? -
我只是手动找到字符串,但这对于长度较大的字符串来说非常耗时。因此,我需要一个有效的解决方案。
答案 0 :(得分:1)
如果您的字符串长度n
由n
个不同的字母组成,那么您找到的数字为: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)
。
有三种情况:
在这种情况下,我们有sum{b_i * b_j : 1 <= i < j <= m}
个不同的字符串。这等于(sum{b_i}^2 - sum{b_i ^2}) / 2
,这个表达式可以在O(m)
时间内进行评估。
在这种情况下,首先选择两对中常见的字母,让我们说它是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)
时间内进行评估。
这个想法是一样的。首先,考虑从所有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)
,这显然是最优的。