解题思路

有一个长度为 n 的字符串(仅包含小写字母),把这个字符串每隔 k 个就分出来一个子串,比如 [1,k] 为第一个子串,[k+1,2k] 为第二个、[2k+1,3k] 为第三个.....(保证n%k=0)
求:把这些子串都变成一样的最少操作次数。

对所有子串的第 1 个字符,求出哪个字符最多,然后把其他不同的字符转换为该字符。这要使这些子串的第 1 个字符相等,这样操作次数最少。
同理,对所有子串的第 2 个至第 k 个字符,使用同样的操作。然后把这些操作次数相加起来就是最终答案。

C++代码

#include<iostream>
using namespace std;

int main(){
    int n, k;
    cin >> n >> k;
    string s;
    cin >> s;
    int cnt = 0;
    int m = n / k;
    for(int i=0; i<k; ++i){
        int a[26] = {0};
        for(int j=i; j<n; j+=k){
            int index = s[j] - 'a';
            a[index] += 1;
        }
        int ma = a[0];
        for(int j=1; j<26; ++j){
            if(a[j] > ma)
                ma = a[j];
        }
        cnt += (m - ma);
    }
    cout << cnt << endl;
    return 0;
}