首页 > 其他分享 >字符串操作

字符串操作

时间:2022-12-22 22:13:17浏览次数:41  
标签:map 26 字母 alpha 字符串 操作

给定一个只包含小写字母字符串,每次可以选择两个相同的字符删除,并在字符串结尾新增任意一个小写字母。
请问最少多少次操作后,所有的字母都不相同?

输入例子:
"abab"
输出例子:
2
例子说明:
第一次操作将两个'a'变成一个'f',字符串变成"bbf"。
第二次操作将两个'b'变成一个'b',字符串变成"fb"。
操作方式不是唯一的,但可以证明,最少操作次数为2。

消掉两个相同的,新增一个任意字母
如果26个字母没有出现完的话,肯定是新增一个没有出现过的字母,因为这样对结果没有影响
否则,如果不得不考虑已经出现过的字符,那么优先选双数的,因为这样增加单个字母不会增加额外的操作
最后才是已经出现过的单个字符

如果26个字母都出现过了的话,那么末尾追加哪一个字母其实都可以,我们假设追加的就是和我们消除的两个字母相同的字母,那么这个操作相当于就是减去一个重复字母
那么有多少个重复字母呢?前面说了最多26种而且都已经出现了,那么大于26的部分就全部是重复部分了
也就是说此时的操作次数=第一次的操作次数+第一次操作完的字符长度-26==字符原始长度-26

int minOperations(string str) {
	unordered_map<char, int> alpha_map;
	for (char ch : str) {
		if (alpha_map.count(ch)) alpha_map[ch]++;
		else alpha_map.emplace(ch, 1);
	}
	int pairs = 0,ans;
	for (pair<char, int> p : alpha_map) 
		if (p.second >= 2) pairs += p.second / 2;
	
	if (str.size() - pairs <= 26) ans = pairs;
	// 关键是这里:是怎么想出来的?
	else ans = str.size() - 26;

	return ans;
}

标签:map,26,字母,alpha,字符串,操作
From: https://www.cnblogs.com/yaocy/p/16999689.html

相关文章