Dies ist eine Lösung, die Entwicklerzeit durch Nutzung eines integrierten Iterators minimiert. Bei Problemgrößen, für die die Antwort selbst nicht zu groß ist, sollte es relativ schnell gehen.
Es gibt eine Eins-zu-eins-Entsprechung zwischen Partitionen einer Zeichenfolge und Teilmengen von potenziellen Schnittpunkten. Wenn die Länge der Zeichenfolge n
ist, gibt es n-1
Orte, an denen Sie die Zeichenfolge schneiden könnten. Ein direkter Weg wäre, solche Teilmengen zu durchlaufen und für jede Teilmenge die Kette auf diese Weise zu zerlegen. Hier ist ein Python-Ansatz, der die Standardmodule itertools
verwendet:
import itertools
def multiSlice(s,cutpoints):
k = len(cutpoints)
if k == 0:
return [s]
else:
multislices = [s[:cutpoints[0]]]
multislices.extend(s[cutpoints[i]:cutpoints[i+1]] for i in range(k-1))
multislices.append(s[cutpoints[k-1]:])
return multislices
def allPartitions(s):
n = len(s)
cuts = list(range(1,n))
for k in range(n):
for cutpoints in itertools.combinations(cuts,k):
yield multiSlice(s,cutpoints)
Zum Beispiel:
>>> parts = allPartitions('World')
>>> for p in parts: print(p)
['World']
['W', 'orld']
['Wo', 'rld']
['Wor', 'ld']
['Worl', 'd']
['W', 'o', 'rld']
['W', 'or', 'ld']
['W', 'orl', 'd']
['Wo', 'r', 'ld']
['Wo', 'rl', 'd']
['Wor', 'l', 'd']
['W', 'o', 'r', 'ld']
['W', 'o', 'rl', 'd']
['W', 'or', 'l', 'd']
['Wo', 'r', 'l', 'd']
['W', 'o', 'r', 'l', 'd']
Beachten Sie, dass dieser Ansatz erzeugt erzeugt ['World']
als Trennwand von 'World'
. Dies entspricht dem Schneiden mit einem leeren Satz von Schnittpunkten. Ich betrachte das eher als ein Feature als als einen Fehler, da die standardmäßige mathematische Definition von Partition die Partitionierung eines Sets in ein Stück ermöglicht. Wenn dies für Ihre Zwecke unerwünscht ist, ist die Behebung einfach - einfach über die nicht leeren Teilmengen der Schnittpunkte iterieren. In Bezug auf die oben genannten Code, dieses Update beläuft sich auf das Hinzufügen von zwei Zeichen zu allPartitions
:
for k in range(n):
von
for k in range(1,n):
Effizient im Hinblick darauf, wie schnell und einfach es ist, schnell zu codieren oder in Bezug darauf, wie es läuft? Gibt es auch eine maximale Länge der Saite? Es wird exponentiell größere Zahlen von Ergebnissen geben, wenn die String-Länge wächst und Sie werden ziemlich schnell Speicherfehler bekommen. – wizzardmr42
Ii zielen darauf ab, einzelne Wörter zu diesem Algo einzugeben, und ich möchte, dass es in der Angelegenheit der Geschwindigkeit effizient ist, aber ich bin neugierig, um die zwei verschiedenen Ansatz zu sehen :) – Ben
Nicht aufführen 'abcd' könnte von Entwurf sein, aber ich denke, du hast 'a', 'bc', 'd' verpasst. –