【教3妹学编程-算法题】输入单词需要的最少按键次数 II

2哥 : 叮铃铃,3妹,准备复工了啊,过年干嘛呢,是不是逛吃逛吃,有没有长胖呢。
3妹 :切,不想上班,假期能不能重来一遍啊,虽然在家我妈张罗着要给我相亲呢。可是在家还是很好的啊。
2哥 : 相亲?哈哈哈哈
3妹 :别笑了,我妈说跟我年龄相等的人都已经孩子上小学了,跟她年龄相等的人孙子最少都会打酱油了。
2哥 :哈哈哈哈,让我先笑一会儿
3妹 :话说2哥过年在家里也刷题吗?
2哥 :当然了,雷打不动。
3妹 :好吧,还得是2哥🐂,我有几天懈怠了。
2哥:好吧,说到刷题啊,今天有一道"最少"的题目, 让我们先做一下吧~

题目:

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

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

现在允许你将编号为 2 到 9 的按键重新映射到 不同 字母集合。每个按键可以映射到 任意数量 的字母,但每个字母 必须 恰好 映射到 一个 按键上。你需要找到输入字符串 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 <= 10^5

word 仅由小写英文字母组成。

思路:

贪心算法,

统计每个字母的出现次数,按照出现次数从大到小排序。

根据 排序不等式,出现次数前 8 大的字母,只需要按一次;出现次数前 9 到 16 大的字母,需要按两次;依此类推。

把出现次数和对应的按键次数相乘再相加,得到的按键次数之和就是最小的。

java代码:

class Solution {
    public int minimumPushes(String word) {
        int[] cnt = new int[26];
        for (char b : word.toCharArray()) {
            cnt[b - 'a']++;
        }
        Arrays.sort(cnt);

        int ans = 0;
        for (int i = 0; i < 26; i++) {
            ans += cnt[25 - i] * (i / 8 + 1);
        }
        return ans;
    }
}
相关推荐
ChoSeitaku18 分钟前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
娅娅梨20 分钟前
C++ 错题本--not found for architecture x86_64 问题
开发语言·c++
汤米粥26 分钟前
小皮PHP连接数据库提示could not find driver
开发语言·php
Fuxiao___27 分钟前
不使用递归的决策树生成算法
算法
冰淇淋烤布蕾29 分钟前
EasyExcel使用
java·开发语言·excel
我爱工作&工作love我32 分钟前
1435:【例题3】曲线 一本通 代替三分
c++·算法
拾荒的小海螺35 分钟前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
马剑威(威哥爱编程)1 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower1 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归