一个英语单词Banana,将所有的字母拆散重新组合,问有多少种组合满足b后边马上出现a

如题所述

你这是英文问题? 数学问题?还是程序问题?

1. 如果是英文问题, 答案是没有, 因为banana无法再组合成其他单词;如果banana本身考虑在内,那么也就这个1个满足要求。

2. 如果是数学问题,那么答案是30. 这是一个古典概率问题, Banana有6个字母,本来有6!种可能的组合;但a重复了3次;n重复了2次,因此最后的组合是6!÷ (3!× 2!)= 60; 但ba相连的,组合则是5×(4!÷ ( 2!× 2!)),因为ba出现的位置有5种,每种的组合(4!,排除剩余的a重复次数2!和n的重复次数2!)=6, 所以最后结果是30

3. 如果是程序问题,那么一个简单的c++程序如下:
#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

int main(int argc, char** argv) {
string str = "Banana";
int total_cnt = 0;
int match_cnt = 0;

sort(str.begin(), str.end());
do {
cout << str << endl;
total_cnt ++;
if (str.find("Ba") != string::npos)
match_cnt ++;
} while (next_permutation(str.begin(), str.end()));

cout << "Total count: " << total_cnt << endl;
cout << "Match found: " << match_cnt << endl;

return 0;
}
运行结果:
Baaann
Baanan
Baanna
Banaan
Banana
Bannaa
Bnaaan
Bnaana
Bnanaa
Bnnaaa
aBaann
aBanan
aBanna
aBnaan
aBnana
aBnnaa
aaBann
aaBnan
aaBnna
aaaBnn
aaanBn
aaannB
aanBan
aanBna
aanaBn
aananB
aannBa
aannaB
anBaan
anBana
anBnaa
anaBan
anaBna
anaaBn
anaanB
ananBa
ananaB
annBaa
annaBa
annaaB
nBaaan
nBaana
nBanaa
nBnaaa
naBaan
naBana
naBnaa
naaBan
naaBna
naaaBn
naaanB
naanBa
naanaB
nanBaa
nanaBa
nanaaB
nnBaaa
nnaBaa
nnaaBa
nnaaaB
Total count: 60
Match found: 30追问

为记得强大和全面点赞,这个是个数学问题,能不能帮我再详细解释一下怎么得到的30

追答

谢谢支持。

1. ba这样的组合,只能出现在5个位置上;(x5)
2. 每出现一次,剩下4个位置,应该是4!组合;但ba出现后,剩下的字母是a a n n, 就是说a a 及 a a这样的组合只能算一次,同样n n和n n的组合也只能算一次,因此要把它们都扣除。 因此是:4!/ (2! x 2!) = 6

3. 这样5 x 6 = 30.

温馨提示:答案为网友推荐,仅供参考