预处理每个小写字母和空格需要按键的次数,再顺序累加整句话。
OJ: luogu
题目 ID: P1765
难度:入门
标签:模拟字符串python
日期: 2026-06-19 09:27
题意
给出一行只包含小写字母和空格的句子。按照老式手机键盘规则,求打出整句话至少需要按多少次键。
思路
同一个按键上的第几个字母,就需要按几次。例如 abc 在同一个键上,a 需要 1 次,b 需要 2 次,c 需要 3 次。
先用字典预处理每个字符的按键次数:
text
a -> 1, b -> 2, c -> 3, ...
空格 -> 1然后扫描整句话,把每个字符对应的次数加起来。
这题是字符映射和累加练习,不创建 brute.py。
Python 知识
/home/rainboy/mycode/hugo-blog/content/program_language/python/input_output_and_strings.md:包含空格的一行要整行读取。/home/rainboy/mycode/hugo-blog/content/program_language/python/collections_toolkit.md:普通dict适合保存字符到次数的映射。enumerate(group)可以同时得到组内下标和字符。sum(press_count[ch] for ch in sentence)用生成器表达式累加。
代码
python
press_count = {}
for group in ["abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]:
for index, ch in enumerate(group):
press_count[ch] = index + 1
press_count[" "] = 1
sentence = input().rstrip("\n")
answer = sum(press_count[ch] for ch in sentence)
print(answer)Pythonic 写法
字典推导建立按键次数表,再 sum:
python
press = {
ch: i + 1
for group in ["abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
for i, ch in enumerate(group)
}
press[" "] = 1
print(sum(press[ch] for ch in input().rstrip("\n")))复杂度
设句子长度为 n,时间复杂度是
总结
固定规则的字符题,先预处理一张映射表,再逐字符扫描,代码会比写很多 if 更清楚。
