これは私のこの問題のコードです。私はこのソリューションのためにTrie treeを使用しています。時間の複雑さや空間の複雑さの点で他の優れたアイデアがあるかどうかは疑問です。また、バグやコードスタイルに関するアドバイスも感謝しています。最小サブセットプレフィックスを見つける
問題:文字列の集合が与えられる
、与えられた入力ワードセット内のすべての入力単語の接頭辞が含まれて設定された所定の入力ワードの最小サブセットを---返します。プレフィックスは、指定された入力セット内の完全な入力単語でなければなりません。プレフィックスを持たない単語の場合は、 がそれ自身を返します。
リストがある場合は[ 'FOO'、 'foog'、 '食べ物'、 '空自']リターン[ 'FOO'、 '空自']
リターンはfoo
以来foo
あるの接頭辞でありますfoo
(それ自体)、foog
の接頭辞、food
の接頭辞(つまり、foo
は、foog
と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
問題の説明が不明です。なぜ入力集合全体を返すのではなく、それらのうちの1つは、与えられた単語の可能な最長接頭辞です。 –
問題は不適切です。例えば、 '[fab、fabc、fbc]'の期待される出力は?それは '[fab、fbc]'または単に '[f]'ですか? (共通の接頭辞はどのように '共通の接頭辞'でなければならないのですか?2つの要素で共有するだけで十分ですか?2つ以上共有する場合は '共通性'が「最大長」よりも優先されますか) –
@RoryDaulton、すべての入力単語の接頭辞である最小の集合を返す。質問の説明も編集しますが、まだ明確でない場合は、修正してください。元の質問に対するあなたのアドバイスは高く評価されます。 –