16-字符串/贪心-相同的字符串
题目
来源
26. 不相同的字符串(第一期模拟笔试)
思路
详见代码
代码
/*
第一种情况:
26个字母没用完,所以每次删的时候只需要增加一个没用过的,
直至用完26个,那就转到第二种情况;
第二种情况:
26个字母已经用完了,那么就把所有多出来的字符全都转化成某一个字母,
比如a,此时的情况一定是a有n个,其他字母全是1个,我们只需要消除多余的a即可。
每次删掉两个a,再转化成一个a,这样操作一次就少一个a,
总会变成所有字母都只剩下一个的情况,即达成题意不重复
*/
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
string s;
int main(){
int n;
while(cin>>n){
while(n--){
cin>>s;
int q[N]={0}; //存储每个字母的出现情况;
//千万不能习惯性赋值为全局变量,不能本道题就会出现错误
for(int i=0;i<s.size();i++){
q[s[i]-'a']++; //统计每个小写字母出现的次数
}
int cnt=0;
for(int i=0;i<26;i++){ //处理第一种情况
if(q[i]>1){
int tmp=q[i]/2;
cnt+=tmp;
q[i]=q[i]-tmp*2;
// cout<<q[i]<<endl;
}
}
//统计还没使用的小写字母
int cnt0=0;
for(int i=0;i<26;i++){
if(q[i]==0)cnt0++;
}
int res;//总的要处理的次数
if(cnt>cnt0){
res=cnt+(cnt-cnt0);
//当超过26个字母时,那就相当于第一种要处理的次数+第二种情况
}
else{
res = cnt;
}
cout<<res<<endl;
}
}
return 0;
}