贪心统计法 (Optimal Greedy)
逻辑原理:
由于双生串的前半部分必须是同一个字符,后半部分也必须是同一个字符,我们可以独立地处理这两个部分:
- 前半部分:统计前n/2个字符中出现频率最高的字符。假设最高频率为maxFreq1,那么前半部分最少修改次数就是n/2 - maxFreq1
- 后半部分:统计后n/2个字符中出现频率最高的字符。假设最高频率为maxFreq2,那么后半部分最少修改次数就是n/2 - maxFreq2
- 总计:将两部分的最小修改次数相加即可。
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 贪心统计
String line = in.nextLine();
int n = line.length();
int half = n / 2;
// 处理前半部分
int[] freq1 = new int[26];
int maxFreq1 = 0;
for (int i = 0; i < half; i++) {
int idx = line.charAt(i) - 'a';
freq1[idx]++;
maxFreq1 = Math.max(maxFreq1, freq1[idx]);
}
// 处理后半部分
int[] freq2 = new int[26];
int maxFreq2 = 0;
for (int i = half; i < n; i++) {
int idx = line.charAt(i) - 'a';
freq2[idx]++;
maxFreq2 = Math.max(maxFreq2, freq2[idx]);
}
// 最小修改次数 = 总长度 - 两部分分别保留的最大相同字符数
int minChange = n - maxFreq1 - maxFreq2;
System.out.println(minChange);
}
}

京公网安备 11010502036488号