对于w列表中的任何给定单词words,我想找到列表中可以w通过更改其中的单个字母而变成的所有其他单词。所有的词都是等长的,只允许替换。调用这个函数parent(w)。
例如,给定words = ["hot","dot","dog","lot","log","cog"],parent("cog")将是["dog", "log"]。parent("lot")会是["dot", "hot", "log"]等等
为此,我首先构建一个反向索引,其中的键映射到在索引处(str, int)具有字符的单词。然后,找到一个词的父词就变成了将所有与该词在相同位置具有相同字母的词相交的任务,除了一个。strint
代码如下,产生一个空集。为什么它不起作用?
from typing import Iterator, Dict, Tuple, Set
import itertools
graph: Dict[Tuple[str, int], Set[int]] = dict()
for i, word in enumerate(words):
for j, ch in enumerate(word):
if (ch, j) not in graph:
graph[(ch, j)] = set()
graph[(ch, j)].add(i)
def parents(word: str) -> Iterator[int]:
n: int = len(word)
s: Set[int] = set()
for part in itertools.combinations(range(n), n - 1):
keys = map(lambda x: (word[x], x), part)
existing_keys = filter(lambda k: k in graph, keys)
for y in itertools.chain(map(lambda k: graph[k], existing_keys)):
s = s.intersection(set(y)) if s else set(y)
return filter(lambda i: words[i] != word, s)
print(list(parents("cog"))) # empty!!!
森林海
繁星点点滴滴
慕运维8079593
撒科打诨
相关分类