问题描述
小U得到一个只包含小写字母的字符串 S。她可以执行如下操作:每次选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。小U想知道,最少需要多少次操作才能使得字符串中的所有字母都不相同?
思路描述
- 统计每个字符出现的次数:首先,我们需要知道字符串中每个字符出现的次数。这可以通过使用一个数组或者
HashMap来实现,其中键是字符,值是该字符出现的次数。 - 计算需要删除的字符对数:遍历这个统计结果,对于每个出现次数大于1的字符,我们需要删除多余的字符对。例如,如果字符
a出现了4次,我们需要删除2对a(即4个a)。这样,我们就可以得到需要删除的字符对总数。 - 计算最少操作次数:由于每次删除操作后,我们可以在末尾添加一个新的字符,所以对于每个需要删除的字符对,我们实际上只需要进行一次操作。因此,需要的操作次数就是需要删除的字符对总数。
- 处理剩余字符:在删除了所有多余的字符对之后,字符串中可能还有一些字符出现次数为1,这些字符不需要进一步操作。但是,如果字符串长度大于26(即字母表的大小),我们还需要继续添加新的字符,直到所有字符都不相同。这意味着,如果字符串长度减去不同字符的数量大于26,我们还需要额外添加一些操作。
完整代码
public class Main {
public static int solution(String S) {
// write code here
// 1. 统计不同字符的相同的数量,放到一个数组中(数频)
// 2. 判断奇数或者偶数 以及2的倍数
int []count=new int[26];
for(char c:S.toCharArray())
{
count[c-'a']++;
}
int operations=0;
for(int freq:count)
{
if(freq>1)
{
operations+=freq/2;
}
}
return operations;
}
public static void main(String[] args) {
System.out.println(solution("abab") == 2);
System.out.println(solution("aaaa") == 2);
System.out.println(solution("abcabc") == 3);
}
}