思路
由于题目中说了可以任意交换两个字符的位置,我们只需要判断这个字符串是否满足回文串的条件即可。
代码:
cpp
#include<bits/stdc++.h>
using namespace std;
int a[30];
int main(){
int T;
cin>>T;
while(T--){
fill(a,a+29,0);//多测要清空
string s;
cin>>s;
for(int i=0;i<s.size();i++){
a[int(s[i]-96)]++;//统计a~z每个字符的个数
}
if(s.size()%2==1){//若字符串长度为奇数
int flag=0;//代表字符串中每个字符的数量为奇数的个数
for(int i=1;i<=26;i++){
if(a[i]%2) flag++;//若为奇数,flag++
}
if(flag!=1) cout<<"No"<<endl;//由于长度为奇数的回文串中间会有一个单独的字符串,所以判断flag是否等于1
else cout<<"Yes"<<endl;
}else{
int flag=0;//同样意思
for(int i=1;i<=26;i++){
if(a[i]%2) flag++;
}
if(flag!=0) cout<<"No"<<endl;//由于长度为偶数的回文串每个字符都两两相对,所以判断flag是否等于0
else cout<<"Yes"<<endl;
}
}
return 0;
}