输入例子: "abab"
输出例子: 2
例子说明:
第一次操作将两个'a'变成一个'f',字符串变成"bbf"。
第二次操作将两个'b'变成一个'b',字符串变成"fb"。
操作方式不是唯一的,但可以证明,最少操作次数为2
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回满足题意的最小操作数
* @param str string字符串 给定字符串
* @return int整型
*/
int minOperations(string str) {
// write code here
int len = str.size();
int result = 0; //返回需要操作的次数
int number = 0; //记录26个字母被使用的次数
int times[26] = { 0 }; //记录字符串中26个字母出现的次数
for (char i : str) {
times[i - 'a']++;
}
for (int j = 0; j < 26; j++) {
if (times[j] == 1) {
number++;
}
if (times[j] % 2 == 0) {
result += times[j] / 2; //消除n个字符,需要的操作次数为n/2;
number += times[j] / 2; //消除n个字符后需要补充的字符数量为:n/2;
}
if (times[j] > 1 && times[j] % 2 != 0) {
result += times[j] / 2;
number += times[j] / 2 + 1;
}
}
if (number > 26) {
result += number - 26;
}
return result;
}
};