解题思路
有一个长度为 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; }