1639. Anzahl der Möglichkeiten, eine Zielzeichenfolge anhand eines Wörterbuchs zu bilden
Schwierigkeit:Schwer
Themen:Array, String, dynamische Programmierung
Sie erhalten eine Liste von Zeichenfolgen mit Wörtern gleicher Länge und ein Zeichenfolgenziel.
Ihre Aufgabe besteht darin, mit den angegebenen Wörtern nach den folgenden Regeln ein Ziel zu bilden:
Beachten Sie, dass Sie mehrere Zeichen aus der gleichen Zeichenfolge in Wörtern verwenden können, sofern die oben genannten Bedingungen erfüllt sind.
Gib die Anzahl der Möglichkeiten zurück, aus Wörtern ein Ziel zu bilden. Da die Antwort möglicherweise zu groß ist, geben Sie sie modulo 109 7.
zurückBeispiel 1:
Beispiel 2:
Einschränkungen:
Hinweis:
Lösung:
Das Problem besteht darin, die Anzahl der Möglichkeiten zur Bildung einer Zielzeichenfolge aus einem Wortwörterbuch zu ermitteln und dabei bestimmte Regeln zur Zeichenverwendung zu befolgen. Dies ist ein kombinatorisches Problem, das mithilfe von Dynamischer Programmierung (DP) und der Vorverarbeitung von Zeichenhäufigkeiten effizient gelöst werden kann.
Die Lösung verwendet:
Schritte:
Lassen Sie uns diese Lösung in PHP implementieren: 1639. Anzahl der Möglichkeiten, eine Zielzeichenfolge anhand eines Wörterbuchs zu bilden
Erläuterung:
Vorverarbeitungsschritt:
- Erstellen Sie ein Zählarray:
- Zählen Sie für jede Wortspalte die Vorkommen jedes Zeichens.
- Beispiel: Wenn Wörter = ["acca", "bbbb", "caca"] sind, zählt für die erste Spalte[0] = {'a': 1, 'b': 1, 'c': 1 }.
Rekursiver DP:
- Definieren Sie dp(i, j):
- i ist der aktuelle Index im Ziel.
- j ist die aktuelle Position in Worten.
- Basisfälle:
- Wenn i == len(target): Gesamtes Ziel gebildet → 1 zurückgeben.
- Wenn j == len(words[0]): Keine weiteren Spalten zu verwenden → 0 zurückgeben.
- Wiederholung:
- Option 1: Verwenden Sie counts[j][target[i]] Zeichen ab Position j.
- Option 2: Position j überspringen.
Optimierung:
- Verwenden Sie eine Memoisierungstabelle, um Ergebnisse überlappender Teilprobleme zu speichern.
Beispiel-Anleitung
Eingabe:
Wörter = ["acca", "bbbb", "caca"], Ziel = "aba"
Vorverarbeitung:
- counts[0] = {'a': 2, 'b': 0, 'c': 1}
- counts[1] = {'a': 0, 'b': 3, 'c': 0}
- counts[2] = {'a': 1, 'b': 0, 'c': 2}
- counts[3] = {'a': 2, 'b': 0, 'c': 1}
DP-Berechnung:
- dp(0, 0): Wie viele Möglichkeiten es gibt, um „aba“ beginnend mit Spalte 0 zu bilden.
- Rekursive Berechnung unter Verwendung von Zählungen und Überspringen von Spalten.
Ausgabe: 6
Zeitkomplexität
- Vorverarbeitung: O(n x m), wobei n die Anzahl der Wörter und m ihre Länge ist.
- Dynamische Programmierung: O(l x m), wobei l die Länge des Ziels ist.
- Gesamt: O(n x m l x m).
Ausgabe als Beispiel
Dieses Problem ist ein großartiges Beispiel für die Kombination von Vorverarbeitung und dynamischer Programmierung, um eine kombinatorische Herausforderung effizient zu lösen.
Kontaktlinks
Wenn Sie diese Serie hilfreich fanden, denken Sie bitte darüber nach, dem Repository einen Stern auf GitHub zu geben oder den Beitrag in Ihren bevorzugten sozialen Netzwerken zu teilen? Ihre Unterstützung würde mir sehr viel bedeuten!
Wenn Sie weitere hilfreiche Inhalte wie diesen wünschen, folgen Sie mir gerne:
Das obige ist der detaillierte Inhalt vonAnzahl der Möglichkeiten, bei einem gegebenen Wörterbuch eine Zielzeichenfolge zu bilden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!