【发布时间】:2020-12-07 20:20:29
【问题描述】:
我在 2020 年 8 月 16 日举行的 Google 编码挑战赛中遇到了以下问题。我试图解决它,但无法解决。
字典中有
N单词,每个单词都是固定的 长度和M仅由小写英文字母组成,即('a', 'b', ...,'z')
查询词由Q表示。长度 查询词是M。这些单词包含小写英文字母 但在某些地方而不是'a', 'b', ...,'z'之间的字母 有'?'。请参阅示例输入部分以了解这一点 案子。Q的匹配计数,用match_count(Q)表示是 字典中包含相同英语的单词数 中的字母(不包括可以在?位置的字母) 与查询词Q中的字母位置相同。其他 单词,字典中的单词可以包含任何字母'?'的位置,但其余字母必须与 查询词。给你一个查询词 Q,你需要计算
match_count.输入格式
- 第一行包含两个空格分隔的整数
N和M,分别表示字典中的单词数和每个单词的长度 分别。- 接下来的
N行各包含一个字典中的单词。- 下一行包含一个整数 Q,表示您必须计算 match_count 的查询词的数量。
- 接下来的
Q行每行包含一个查询词。
输出格式
对于每个查询词,打印match_count以获得新行中的特定词。
约束1 <= N <= 5X10^4 1 <= M <= 7 1 <= Q <= 10^5
所以,我有 30 分钟的时间来回答这个问题,我可以编写以下不正确的代码,因此没有给出预期的输出。
def Solve(N, M, Words, Q, Query):
output = []
count = 0
for i in range(Q):
x = Query[i].split('?')
for k in range(N):
if x in Words:
count += 1
else:
pass
output.append(count)
return output
N, M = map(int , input().split())
Words = []
for _ in range(N):
Words.append(input())
Q = int(input())
Query = []
for _ in range(Q):
Query.append(input())
out = Solve(N, M, Words, Q, Query)
for x in out_:
print(x)
有人可以帮我提供一些可以解决这个问题的伪代码或算法吗?
【问题讨论】:
-
显而易见的算法难道不是“对于每个 Query,对于每个 Word,对于 Query 中的每个字母,如果字母相同或问号,则 count+=1”?跨度>
-
我正在努力考虑对不需要大量内存的明显算法进行改进。到目前为止,我有 N+2^M 内存用于预计算位域,还有 N+M!预计算尝试的内存。
-
是的,count+=1!!但我得记下这封信的位置。此外,多个“?”可以在查询中出现。
-
一个人可以使用 N*M 额外的内存来使明显的查询快约 26 倍,我想,通过每个单词只跟踪一个字母而不是完整的位域......
-
"多个 ? 可以在一个查询中出现" 如果您一次比较每个字母,这不是问题。不要使用拆分。