问题:
有n个字母,列出由该字母组成的字符串的全排列(相同的排列只计一次)
输入:
第一行输入是字母个数n,1<=n<=20。接下来一行输入的是待排列的n个字母。
输出:
计算出的n 个字母的所有不同排列总数
例如:
输入:
4
aacc
输出:
6
分析:
求出全部的字符的组合排列,就是n的阶层
然后求出有重复字母的个数,这些个数的阶层,用总的阶层/这些数的阶层,依次进行,就是答案
代码:
#include<iostream>
using namespace std;
int f(int n){
int sum=1;
for(int i=1;i<=n;i++){
sum*=i;
}
return sum;
}
int main(){
int n;
cin>>n;
string s;
cin>>s;
int sum1=f(n);//总排列数
int p[26]={0};//用来记录重复数字的个数
string s1="abcdefghijklmnopqrstuvwxyz";
for(int i=0;i<n;i++){
int k=s1.find(s[i]);
p[k]++;
}
for(int i=0;i<26;i++){
int sum2=1;
if(p[i]>1){
sum2=f(p[i]);
}
sum1=sum1/sum2;
}
cout<<sum1<<endl;
return 0;
}
结果: