Every day a Leetcode
解法1:哈希 + 排序
本题与 3014. 输入单词需要的最少按键次数 I 唯一不同的点在于:
3014. 输入单词需要的最少按键次数 I 中字符串 word 所有字母互不相同,而 3016. 输入单词需要的最少按键次数 II
中字符串 word 的字符可以重复。
因为我们希望出现次数多的字符的点击次数尽可能少。
我们用一个哈希表 alpha 统计字符串 word 中各个字符 c 出现的次数,按降序排序。
遍历哈希表 alpha,当前下标为 i,当前字符次数为 alpha[i],它的单次点击所需次数为 i/8+1 次,因为我们只有 8 个按钮可以按。把 alpha[i] * (i / 8 + 1) 累加起来,这样得到的总按键次数最小。
代码:
/*
* @lc app=leetcode.cn id=3016 lang=cpp
*
* [3016] 输入单词需要的最少按键次数 II
*/
// @lc code=start
class Solution
{
public:
int minimumPushes(string word)
{
// 特判
if (word.empty())
return 0;
int n = word.size();
vector<int> alpha(26, 0);
for (char &c : word)
alpha[c - 'a']++;
sort(alpha.begin(), alpha.end(), greater<int>());
int ans = 0;
for (int i = 0; i < 26; i++)
ans += alpha[i] * (i / 8 + 1);
return ans;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是字符串 word 的长度。
空间复杂度:O(n),其中 n 是字符串 word 的长度。