题目描述
输入一个字母字符串和一个 k 值,你需要将其调整为:
字符串时回文字符串,如 abba。
字符串每 k 个为一段,每一段都是相同的,如 k 为 3,abcabcabc满足条件。
调整可以将任意位置的字符改成任意字符,但调整一次记一次数。问调整完毕需要进行多少次调整。
输入格式
第一行两个整数,用空格隔开,分别代表字符串长度和 k。第二行一行字符串,代表待调整的字符串。
输出格式
一个整数,表示调整的次数。
输入输出样例
输入
6 2babbab
输出
2
说明/提示
babbab 改为 bbbbbb,共 2 次调整。
#include <iostream>
using namespace std;
int main(){
int n , k ;
string s;
cin>>n>>k;
cin>>s;
int a[26] = {};
int ans=0; //调整次数
int max_cut = 0;
for(int i=0; i<k/2; i++){
for(int j=0; j<26; j++){ //将数组a全赋0
a[j]=0;
}
for(int j=0; j<n/k; j++){
int ab = s[j*k+i]-(int)'a';
a[ab]+=1;
int ac = s[j*k+k-i-1]-(int)'a';
a[ac]+=1;
}
//求数组a中最大的数
max_cut = a[0];
for(int j=1; j<26; j++){
if(a[j]>max_cut){
max_cut = a[j];
}
}
ans+=n/k*2-max_cut;
}
for(int j=0; j<26; j++){ //将数组a全赋0
a[j]=0;
}
if(k%2!=0){
for(int i=0; i<n/k; i++){
int ad = s[k/2+i*k]-(int)'a';
a[ad]+=1;
}
//求数组a中最大的数
max_cut = a[0];
for(int j=1; j<26; j++){
if(a[j]>max_cut){
max_cut = a[j];
}
}
ans += n/k-max_cut;
}
cout<<ans;
return 0;
}