字符串操作
给定一个只包含小写字母字符串,每次可以选择两个相同的字符删除,并在字符串结尾新增任意一个小写字母。
请问最少多少次操作后,所有的字母都不相同?
输入例子:
"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; }
本文作者:YaosGHC
本文链接:https://www.cnblogs.com/yaocy/p/16999689.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步