相对比较简单的贪心题目。消除重复字符有两种方法,将两个相同字符消去一个,或是更换为另一种字符。例如aaaa可以将aa变成一个b,再将剩下aa变成一个a。也可以三次消除操作得到一个a。显然变成一个未出现的字母效果更好。
class Solution
{
public:
int minOperations(string str)
{
int i,j,n,d[30]= {0},val=0,ans=0;
for(i=0; i<str.size(); i++)/**< 统计每个小写字母出现次数 */
d[str[i]-'a']++;
for(i=0; i<26; i++)
if(d[i]==0)/**< 凡是没出现的字母都是一种机会,可以把已有字母修改为没出现过的字母 */
val++;
for(i=0; i<26; i++)
{
if(d[i]==2)
ans++;
else if(d[i]>2)
{
while(val>0&&d[i]>2)/**< 先尝试修改为未出现字母 */
d[i]-=2,val--,ans++;
ans+=d[i]-1;/**< 没有val机会每次只能消除一个,例如aaaa,得消除3次才能得到a */
}
}
return ans;
}
};