题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6264
题意:给出字符串s,1 ≤ |s| ≤ 100,字符串有小写字母组成。一个字符串是超级回文串是指:字符串的任意长度为奇数的子串都是回文串。对字符串每操作一次可以将某个位置的字符换为另一个小写字母,问最少几步可以将字符串s变为超级回文。
解析:根据超级回文的性质可以发现,超级回文只有两种情况:
- 仅由两个不同的字符交替出现。
- 全为同一个字符。
那么答案①为:
- 求出字符串s奇数位置出现次数最多的字母,将奇数位置的字母全替换为此字母所需的步数。
- 加上字符串s偶数位置出现次数最多的字母,将偶数位置的字母全替换为此字母所需的步数。
答案②为:
- 求出整个字符串s中出现次数最多的字母,将所有字母均替换为此字母需要的步数。
最终的答案就是min(答案①,答案②)。
代码:
#include <bits/stdc++.h>
using namespace std;
char str[105];
int num[30];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",str);
int len=strlen(str);
memset(num,0,sizeof(num));
for(int i=0;i<len;i+=2)
num[str[i]-'a']++;
int maxv=0;
for(int i=0;i<26;i++)
maxv=max(maxv,num[i]);
int tmp=len/2;
if(len&1) tmp++;
tmp=tmp-maxv;
int ans=tmp;
memset(num,0,sizeof(num));
for(int i=1;i<len;i+=2)
num[str[i]-'a']++;
maxv=0;
for(int i=0;i<26;i++)
maxv=max(maxv,num[i]);
tmp=len/2;
tmp=tmp-maxv;
ans=ans+tmp;//答案①
memset(num,0,sizeof(num));
for(int i=0;i<len;i++)
num[str[i]-'a']++;
maxv=0;
for(int i=0;i<26;i++)
maxv=max(maxv,num[i]);
tmp=len-maxv;//答案②
ans=min(ans,tmp);
cout<<ans<<endl;
}
return 0;
}