Hier ist mein Code für dieses Problem. Ich benutze Trie Baum für diese Lösung und frage mich, ob andere bessere Ideen in Bezug auf bessere Zeit Komplexität oder Komplexität des Raumes. Auch Bugs und Codestil-Ratschläge sind willkommen.Finde die kleinsten Subset-Präfixe
Problem:
eine Menge von Strings gegeben, kehrt die kleinste Teilmenge des gegebenen Eingangswortes gesetzt --- eingestellten Präfixe für alle Eingangsworte im gegebenen Eingangswort enthält. Das Präfix sollte ein vollständiges Eingabewort in dem gegebenen Eingabesatz sein, mit Ausnahme eines Präfixes eines gegebenen Wortes. Für ein Wort, das kein Präfix hat, gibt sich selbst zurück.
Wenn die Liste [ 'foo', 'FOOG', 'Lebensmittel', 'asdf'] return [ 'foo', 'asdf']
Die Rückkehr ist foo
seit foo
ist Präfix für foo
(selbst), Präfix für foog
und Präfix für food
(mit anderen Worten, foo
könnte längere Zeichenfolge wie foog
und food
"darstellen"). Ausgabe enthält auch asdf
, weil es kein Präfix für andere Wörter in der Eingabeliste ist, also selbst ausgegeben.
Der leere Satz ist keine richtige Antwort, da er nicht die längsten möglichen Präfixe enthält.
Quellcode:
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
Ich finde deine Problembeschreibung unklar. Warum nicht einfach den gesamten Eingabesatz zurückgeben - einer davon ist der längste mögliche Präfix für ein gegebenes Wort. –
Das Problem ist schlecht formuliert: Was ist zum Beispiel die erwartete Ausgabe für '[fab, fabc, fbc]'? Ist es '[fab, fbc]' oder nur '[f]'? (Wie häufig sollte das "gemeinsame Präfix" sein? Reicht es aus, nur von zwei Elementen geteilt zu werden oder wenn es von mehr als zwei geteilt wird, dann hat "Gemeinsamkeit" Vorrang vor "Maximallänge"?) –
@RoryDaulton, brauche ich um den kleinsten Satz zurückzugeben, der das Präfix für alle eingegebenen Wörter ist. Ich bearbeite die Frage Beschreibung, bitte zögern Sie zu korrigieren, wenn immer noch nicht klar. Ihr Rat zu ursprünglichen Fragen wird sehr geschätzt. –