- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 2020 年 8 月 16 日的 Google Coding Challenge 中遇到了以下问题。我试图解决它,但无法解决。
There are
N
words in a dictionary such that each word is of fixedlength andM
consists only of lowercase English letters, that is('a', 'b', ...,'z')
A query word is denoted byQ
. The lengthof query word isM
. These words contain lowercase English lettersbut at some places instead of a letter between'a', 'b', ...,'z'
there is'?'
. Refer to the Sample input section to understand thiscase.
A match count ofQ
, denoted bymatch_count(Q)
is thecount of words that are in the dictionary and contain the same Englishletters(excluding a letter that can be in the position of?
) in thesame position as the letters are there in the query wordQ
. In otherwords, a word in the dictionary can contain any letters at theposition of'?'
but the remaining alphabets must match with thequery word.You are given a query word Q and you are required to compute
match_count
.Input Format
- The first line contains two space-separated integers
N
andM
denoting the number of words in the dictionary and length of each wordrespectively.- The next
N
lines contain one word each from the dictionary.- The next line contains an integer Q denoting the number of query words for which you have to compute match_count.
- The next
Q
lines contain one query word each.Output Format
For each query word, printmatch_count
for a specific word in a new line.
Constraints1 <= N <= 5X10^4
1 <= M <= 7
1 <= Q <= 10^5
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)
有人可以帮我提供一些可以解决这个问题的伪代码或算法吗?
最佳答案
我想我的第一次尝试是更换 ?
与 .
在查询中,即更改 ?at
至 .at
,然后将它们用作正则表达式并将它们与字典中的所有单词进行匹配,就像这样简单:
import re
for q in queries:
p = re.compile(q.replace("?", "."))
print(sum(1 for w in words if p.match(w)))
但是,将输入大小视为 N 高达 5x104 和 Q 高达 105,这可能太慢了,就像任何其他算法比较所有单词和查询对一样。
M
,每个单词的字母数,是常数且相当低。因此,您可以为所有位置的所有字母创建 Mx26 组单词,然后获取这些组的交集。
from collections import defaultdict
from functools import reduce
M = 3
words = ["cat", "map", "bat", "man", "pen"]
queries = ["?at", "ma?", "?a?", "??n"]
sets = defaultdict(set)
for word in words:
for i, c in enumerate(word):
sets[i,c].add(word)
all_words = set(words)
for q in queries:
possible_words = (sets[i,c] for i, c in enumerate(q) if c != "?")
w = reduce(set.intersection, possible_words, all_words)
print(q, len(w), w)
在最坏的情况下(查询的非
?
字母对字典中的大多数或所有单词都很常见)这可能仍然很慢,但过滤单词应该比迭代所有单词快得多每个查询。 (假设单词和查询中的字母都是随机的,第一个字母的单词集将包含 N/26 个单词,前两个的交集包含 N/26² 个单词等)
?
,只要检查它是否在
set
中(!) 没有创建所有这些交集的单词; (b) 如果查询全部是-
?
, 只返回所有单词的集合; (c) 按大小对可能的词集进行排序,并首先从最小的集开始交集,以减少临时创建的集的大小。
?
的数量。在查询中(以及要创建的集合交集的数量),以及集合的平均大小。对于具有零、一或 M 非
?
的查询字符,查询将在 O(M) 中执行(评估情况,然后进行单个 set/dict 查找),但对于具有两个或多个非
?
的查询-characters,第一组交集的平均复杂度为 O(N/26),严格来说仍然是 O(N)。 (以下所有交叉点只需要考虑 N/26²、N/26³ 等元素,因此可以忽略不计。)我不知道这与 The Trie Approach 相比如何,如果任何其他答案可以详细说明,我会非常感兴趣在那。
关于python - 2020 年 Google 编程挑战题 : Unspecified Words,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63472161/
我有两个关于这段代码的问题。 double*** pdata 和 int*** pmask 是什么意思?指向指针的指针?为什么或何时需要这样做? int 和 double 是不同的类型,double*
谁能用英文解释一下这是怎么回事? std::vector cats; //I get that cats is a vector of Cat objects if (std::find(cats.b
在C中,下列声明有区别吗: float DoSomething( const float arr[] ); 对比 float DoSomething( const float* arr ); 一个比另
我到 question 36我认为这很简单。像往常一样,我显然错了。我正在尝试在 Python 中执行此操作(因为我不知道 Python)。我的代码如下。我得到 19 作为输出,这显然是不正确的。我不
我已经通读了 MSDN 上的 Winsock2 文档,但如果有人能提供帮助,我仍然需要澄清一些事情。 我计划做一些类似于您在使用 WSAAsyncSelect() 时获得的设置,但使用一个单独的线程。
#include int main () { int *p = (int *)malloc((100*sizeof(int))); p++; free(p); /* do some
我想提供未知的“对象”并返回其成员之一的值。在 C# 中需要响应。 一般来说,我想我正在寻找这个方法的代码公共(public)静态对象 GetObjectMemberValue (object myO
由异常准确的 AI 提供支持的 20 个问题的简单在线游戏。 他们怎么猜得这么好? 最佳答案 您可以将其视为二进制搜索算法。在每次迭代中,我们都会提出一个问题,该问题应该会消除大约一半的可能单词选择。
拜托,有人可以解释一下吗: 如果文档说 STL std::vector finding element speed performace = O(ln(n)),这是什么意思。 O(ln(n)) - 什
我正在尝试通过遵循 Microsoft 为 ADSI API 和 Windows-RS crate 发布的 c++ 示例来使用 Rust 的事件目录。我不太明白这里发生了什么: https://doc
这是处理具有重复元素的单个列表的 nieve 案例,我在处理一些嵌套列表时遇到了麻烦,所以我想先写简单的案例。 所以我有: (defn packDuplicatesIntoLists [lis
我是新来的。我正在尝试解决此练习 Problem 18只是为了加强我的解决能力。我已经编码了答案。该任务要求“在 1,000,000 以下的质数中,有多少个数位之和等于两周中的天数?” (两周是 14
我正在尝试对POCO类中的某些字段进行索引,并将某些属性装饰为“忽略= true”,并且这些字段不应被索引,而应该被存储。我希望这些字段出现在搜索结果中,但不应作为索引。 我正在尝试对应索引的几个字段
我是编码的新手,正在尝试通过完成 Project Euler 问题来学习 Swift。我似乎有导致大量错误的不同版本的 Swift 代码。如果您对我的问题的格式有任何建议以供将来引用,请告诉我,谢谢。
对于problem statement在 google codejam 2008:第 1A 轮问题 3 In this problem, you have to find the last three
我是一名优秀的程序员,十分优秀!