LeetCode 3016.输入单词需要的最少按键次数 II:排序(贪心)

【LetMeFly】3016.输入单词需要的最少按键次数 II:排序(贪心)

力扣题目链接:https://leetcode.cn/problems/minimum-number-of-pushes-to-type-word-ii/

给你一个字符串 word,由小写英文字母组成。

电话键盘上的按键与 不同 小写英文字母集合相映射,可以通过按压按键来组成单词。例如,按键 2 对应 ["a","b","c"],我们需要按一次键来输入 "a",按两次键来输入 "b",按三次键来输入 "c"

现在允许你将编号为 29 的按键重新映射到 不同 字母集合。每个按键可以映射到任意数量 的字母,但每个字母 必须 恰好 映射到 一个 按键上。你需要找到输入字符串 word 所需的最少按键次数。

返回重新映射按键后输入 word 所需的 最少按键次数。

下面给出了一种电话键盘上字母到按键的映射作为示例。注意 1*#0 对应任何字母。

示例 1:

复制代码
输入:word = "abcde"
输出:5
解释:图片中给出的重新映射方案的输入成本最小。
"a" -> 在按键 2 上按一次
"b" -> 在按键 3 上按一次
"c" -> 在按键 4 上按一次
"d" -> 在按键 5 上按一次
"e" -> 在按键 6 上按一次
总成本为 1 + 1 + 1 + 1 + 1 = 5 。
可以证明不存在其他成本更低的映射方案。

示例 2:

复制代码
输入:word = "xyzxyzxyzxyz"
输出:12
解释:图片中给出的重新映射方案的输入成本最小。
"x" -> 在按键 2 上按一次
"y" -> 在按键 3 上按一次
"z" -> 在按键 4 上按一次
总成本为 1 * 4 + 1 * 4 + 1 * 4 = 12 。
可以证明不存在其他成本更低的映射方案。
注意按键 9 没有映射到任何字母:不必让每个按键都存在与之映射的字母,但是每个字母都必须映射到按键上。

示例 3:

复制代码
输入:word = "aabbccddeeffgghhiiiiii"
输出:24
解释:图片中给出的重新映射方案的输入成本最小。
"a" -> 在按键 2 上按一次
"b" -> 在按键 3 上按一次
"c" -> 在按键 4 上按一次
"d" -> 在按键 5 上按一次
"e" -> 在按键 6 上按一次
"f" -> 在按键 7 上按一次
"g" -> 在按键 8 上按一次
"h" -> 在按键 9 上按两次
"i" -> 在按键 9 上按一次
总成本为 1 * 2 + 1 * 2 + 1 * 2 + 1 * 2 + 1 * 2 + 1 * 2 + 1 * 2 + 2 * 2 + 6 * 1 = 24 。
可以证明不存在其他成本更低的映射方案。

提示:

  • 1 <= word.length <= 105
  • word 仅由小写英文字母组成。

解题方法:排序

贪心思路:出现次数多的字符分配到按键次数少的位置。

遍历一遍原始字符串,使用一个大小为 26 26 26的数组记录每种字符的出现次数,把出现次数按从大到小的顺序排序,接着按照只用按1次的位置开始分配(最多分配8个字符)、需要按2次的位置继续分配(最多分配8个字符)、...、直至分配完毕为止。

分配完的标志可以视为26种字符处理完毕,也可视为处理到了出现次数为0的字符。

  • 时间复杂度 O ( l e n ( w ) + C log ⁡ C ) O(len(w) + C\log C) O(len(w)+ClogC),其中 C = 26 C=26 C=26
  • 空间复杂度 O ( C ) O(C) O(C)

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-07-31 08:24:25
 */
class Solution {
public:
    int minimumPushes(string& word) {
        int cnt[26] = {0};
        for (char c : word) {
            cnt[c - 'a']++;
        }
        ranges::sort(cnt, greater<>());
        int ans = 0, round = 1, th = 0;
        for (int t : cnt) {
            th++;
            if (th == 9) {
                th = 1;
                round++;
            }
            ans += t * round;
        }
        return ans;
    }
};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
火车叼位13 小时前
Bash 实现 IDE 式补全的组件与配置
linux·运维
潘正翔13 小时前
k8s高级_调度器Deployment
linux·运维·云原生·容器·kubernetes·jenkins·devops
H_oRIZoN_13 小时前
Linux入门DAY27(文件IO(系统调用)详解|open/read/write/lseek)
java·linux·服务器
kaixin_啊啊13 小时前
专用优化算法LKH
算法
海兰14 小时前
【插件】Logbook 插件完全指南(适配 Ubuntu 24.04)
linux·运维·人工智能·ubuntu·agent·openclaw
好评12414 小时前
【Linux】Socket编程TCP
linux·网络·tcp/ip
前进吧-程序员14 小时前
从零入门:eBPF 是什么、解决什么问题以及它的历史
linux
RisunJan14 小时前
Linux命令-whoami(显示当前有效用户名)
linux·运维·chrome
_Narcissus_15 小时前
二分算法笔记及例题
数据结构·c++·笔记·算法·蓝桥杯·查找·二分算法
tachibana215 小时前
RAGAS 指标解读
数据库·人工智能·算法·机器学习·架构·大模型·llm