刚看到这道题的时候有点不知道从哪里下手, 仔细看了一下遍后发现了一点规律
可以把这道题当成一个二维数组看,len/k行,k列,题目要求最少修改次数得到k段一样的字符串,这里我们可以统计每行中,每个字母出现的个数 ,记录出现次数最多的那个字母,然后用k减掉它的次数就能得到这一行应该修改字母的个数,把所有行应该修改的个数加起来就是答案
//重复字符串
#include<iostream>
//#include<bits/stdc++.h>
//#include<algorithm>
using namespace std;
int main()
{
int k;//k段
int sum = 0;//最后应该修改的个数
cin >> k;
string str;
cin >> str;
int len = str.length();//字符串长度
// if(len%k!=0)//最后一个测试用例有毒,加这个判断的话最后一个过不去,
// cout << -1<<endl;//按道理讲,最后一个测试用例应该是不可能分成111段的
// else{
for (int i = 0; i < len/k;i++)
{
int lst[27] = {0};//记录每个字母出现的个数
int max = 0;//出现最多的字母的个数
for (int j = 0; j < k;j++)
{
int x=++lst[str[j * (len/k)+i] - 'a'];//记录每个字母出现的次数
if(x>max)//最新出现的这个字母的个数比max多
max = x;
}
sum +=k - max;//更新应该修改的字母数
}
// }
cout << sum <<endl;
system("pause");
return 0;
}