题目传送门
题意:
给定一个字符串S。问交换任意S中的两个字符能拼成多少种不同的字符串。
思路:
我用一个名叫zm的数组存储了字符串S中a~z出现的次数。于是有了两种情况:
1.S中没有重复的字母,这时可以拼成s.size()+s.size()-1+s.size()-2+……+2+1种不同的字符串(jj函数的作用)。
2.S中有重复字母。这时答案就在没有重复字母的基础上减去了jj(重复字母个数)然后再加上1(因为可以变换为原来的S)。
易错点:每一种情况的条件要写全!!!
代码:(c++)
#include<bits/stdc++.h>
using namespace std;
int zm[26]={0};
long long jj(long long a){
for(int i=a-1;i>=1;i--) a+=i;
return a;
}
int main(){
long long ans;
string s;
cin>>s;
int l=s.size(),f=0;
ans=jj(l-1);
for(int i=0;i<l;i++){
ans-=zm[s[i]-'a'];
zm[s[i]-'a']++;
if(zm[s[i]-'a']==2) f=1;
}
cout<<ans+f;
return 0;
}