【发布时间】:2016-12-30 01:30:23
【问题描述】:
这是我解决这个问题的代码。我正在为这个解决方案使用 Trie 树,并想知道在更好的时间复杂度或空间复杂度方面是否还有其他更好的想法。也感谢任何错误和代码风格的建议。
问题:
给定一组字符串,返回给定输入词集的最小子集 --- 包含给定输入词集中每个输入词的前缀。前缀应该是给定输入集中的完整输入词,而不是给定词的前缀,对于没有前缀的词, 返回自己。
如果列表是 ['foo', 'foog', 'food', 'asdf'] 返回 ['foo', 'asdf']
返回是foo,因为foo 是foo(本身)的前缀,foog 的前缀和food 的前缀(换句话说,foo 可以“表示”更长的字符串,例如@ 987654327@ 和 food)。输出还包含asdf,因为它不是输入列表中任何其他单词的前缀,所以输出本身。
空集不是正确答案,因为它不包含可能的最长前缀。
源代码:
from collections import defaultdict
class TrieNode:
def __init__(self):
self.children = defaultdict(TrieNode)
self.isEnd = False
def insert(self, word):
node = self
for w in word:
node = node.children[w]
node.isEnd = True
def find_prefix(self, prefix, result):
if self.isEnd:
result.append(prefix[:])
return
for k,v in self.children.items():
prefix.append(k)
v.find_prefix(prefix, result)
prefix.pop(-1)
if __name__ == "__main__":
words = ['foo', 'foog', 'food', 'asdf']
root = TrieNode()
for w in words:
root.insert(w)
result = []
root.find_prefix([], result)
print result
【问题讨论】:
-
我发现您的问题描述不清楚。为什么不只返回整个输入集——其中一个是任何给定单词的最长前缀。
-
问题表述不当:例如,
[fab, fabc, fbc]的预期输出是什么?是[fab, fbc]还是[f]? (“通用前缀”应该有多“通用”?仅由 2 个元素共享就足够了,或者如果它由两个以上共享,那么“通用性”优先于“最大长度”?) -
@RoryDaulton,我需要返回最小的集合,它是所有输入单词的前缀。我也编辑了问题描述,如果仍然不清楚,请随时纠正。非常感谢您对原始问题的建议。
-
@AdrianColomitchi,感谢 cmets,我已编辑问题以使其更清楚。在您的示例中,应该返回
[fab, fbc],因为f不是输入集中的单独单词。如果仍有任何不清楚的地方,请随时提出建议。非常感谢您对原始问题的建议。 -
啊,所以不仅是通用前缀,而且是其他人通用前缀的整个单词?
标签: python algorithm python-2.7