python - 哈希表:赎金票据(超过时间限制)
问题描述
哈罗德是一个绑匪,他写了一张赎金单,但现在他担心会通过他的笔迹追溯到他。他找到了一本杂志,想知道他是否可以从中剪下整个单词,并用它们来制作一份无法追踪的赎金记录复制品。他的笔记中的单词是区分大小写的,他只能使用杂志中可用的整个单词。他不能使用子字符串或连接来创建他需要的单词。
给定杂志上的文字和赎金信中的文字,如果他能准确地使用杂志上的整个文字复制他的赎金信,则打印 Yes;否则,打印编号。
示例 =“黎明攻击”=“黎明攻击”
杂志上的字都是对的,但有一个大小写不匹配的地方。答案是 。
功能说明
在下面的编辑器中完成 checkMagazine 功能。如果可以使用杂志形成便笺,则必须打印,或者。
checkMagazine 有以下参数:
字符串杂志[m]:杂志中的单词字符串注释[n]:赎金票据中的单词打印
string: 或者 , 没有返回值 输入格式
第一行包含两个以空格分隔的整数, 和 ,分别是 和 中的单词数。第二行包含空格分隔的字符串,每个 . 第三行包含以空格分隔的字符串,每个 .
约束
. 每个单词都由英文字母组成(即 to 和 to )。样本输入 0
6 4 今天晚上给我一个盛大今天给一个盛大样本输出 0
是 样本输入 1
6 5 二乘三不是四 二乘二是四 采样输出 1
无解释 1
“二”在杂志中只出现一次。
样本输入 2
7 4 我得到了一堆可爱的椰子 我得到了一些椰子 样本输出 2
不
解释2
哈罗德的杂志没有这个词。
# Complete the checkMagazine function below.
def checkMagazine(magazine, note):
hash_table = [[] for _ in range(5)]
test=0
for a in magazine:
length=len(a)
key=(length-1)%5
hash_table[key].append(a)
for a in note:
key=(len(a)-1)%5
if a not in hash_table[key]:
test=1
break
else:
hash_table[key].remove(a)
if test==1:
print("No")
else:
print("Yes")
我的案例 16 和 17 超出了我的时间限制。请帮助如何改进它
解决方案
介绍 Python 计数器
来自文档: Counter 是dict
用于计数hashable
对象的子类。它是一个集合,其中元素存储为字典键,它们的计数存储为字典值。
from collections import Counter
def checkMagazine(magazine, note):
magazine_counter = Counter(magazine)
note_counter = Counter(note)
return "Yes" if magazine_counter & note_counter == note_counter else "No"
两个计数器之间的逻辑&
将为您提供相应计数的最小值。将结果与note
您想要的结果进行比较。
推荐阅读
- visual-studio-debugging - Concord(VS调试器)方法链接问题
- amazon-web-services - AWS EC2 使用私有 IP 神奇地路由到 S3
- switch-statement - 在 for 循环中使用带有 5 个案例的 switch 语句。如何将案例语句保存到数据库中?
- c# - 如何让精灵在单人游戏中从一个位置到鼠标点击进行可见的移动?
- video-streaming - 输入少量输入样本后,英特尔图形硬件 H264 MFT ProcessInput 调用失败,同样适用于 Nvidia 硬件 MFT
- java - 如何在 Mac 中的 java 中恢复使用 File.delete() 方法删除的文件
- ruby-on-rails - “best_in_place” gem 是否适用于 Rails 6?
- c++ - 将函数传递给动态链接库
- ios - UISegmentedControl iOS 13 一起改变 UIControlStateSelected 和 UIControlStateHighlighted 的颜色
- matlab - 三维最小均方