题目:https://leetcode-cn.com/problems/change-minimum-characters-to-satisfy-one-of-three-conditions/
思路:第三种情况比较简单,只需要看转换成相同字符需要多少次(结果我看英文题目理解错了);对于一、二两种情况,需要枚举分界线的位置,统计次数可以用前缀和搞定。
class Solution {
public:
int minCharacters(string a, string b) {
vector<int> cnt_a(26, 0), cnt_b(26, 0);
for (char c : a) {
cnt_a[c - 'a']++;
}
for (char c : b) {
cnt_b[c - 'a']++;
}
int res = a.size() + b.size();
for (int i = 0; i < 26; ++i) {
res = min(static_cast<int>(a.size() + b.size() - cnt_a[i] - cnt_b[i]), res);
}
vector<int> sum_a(27, 0), sum_b(27, 0);
for (int i = 0; i < 26; ++i) {
sum_a[i+1] = sum_a[i] + cnt_a[i];
sum_b[i+1] = sum_b[i] + cnt_b[i];
}
//寻找分界线
for (int i = 0; i < 25; ++i) {
res = min(res, sum_a[26] - sum_a[i+1] + sum_b[i+1] - sum_b[0]);
res = min(res, sum_b[26] - sum_b[i+1] + sum_a[i+1] - sum_a[0]);
}
return res;
}
};