Durchläufe schwieriger Aufgaben: Word Ladder II und Alien Dictionary
Bearbeiten Sie zwei schwierige Aufgaben von Anfang bis Ende – word-ladder-II mit BFS und Backtracking sowie alien-dictionary mit topologischer Sortierung – mit vollständiger Erklärung.
Durchläufe schwieriger Aufgaben: Word Ladder II und Alien Dictionary ist eine kostenlose Coding Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Coding Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Warum schwierige Aufgaben anders sind
Schwierige LeetCode-Aufgaben unterscheiden sich in zwei wesentlichen Punkten von mittelschweren Aufgaben: (1) Sie erfordern die Kombination von zwei oder mehr algorithmischen Techniken, und (2) die optimale Lösung ist allein aus der Aufgabenstellung oft nicht ersichtlich – Sie müssen die oberflächliche Beschreibung durchdringen und die zugrunde liegende Graph- oder DP-Struktur erkennen. Word Ladder II und Alien Dictionary sind klassische schwierige Aufgaben, die immer wieder in FAANG-Vorstellungsgesprächen vorkommen.
Der Ansatz für schwierige Aufgaben: Versuchen Sie nicht, die vollständige Lösung sofort zu erkennen. Teilen Sie die Aufgabe stattdessen in Teilaufgaben auf, bestimmen Sie die Struktur jeder Teilaufgabe, lösen Sie sie unabhängig voneinander und verbinden Sie sie anschließend. Dieses modulare Denken ist der Schlüssel zum Lösen schwieriger Aufgaben unter Zeitdruck.
# Hard problem meta-strategy
strategy = [
'1. Read the problem 2x — hard problems often have subtle constraints',
'2. Model it as a known structure: graph? DP table? sorted order?',
'3. Break into sub-problems: separate the graph-building from the traversal',
'4. Solve sub-problems in order, verifying each before connecting',
'5. Handle the edge case where no solution exists (empty result, -1, [])',
'6. Optimise only after the correct but slow solution works',
]
print('Hard problem meta-strategy:')
for step in strategy:
print(f' {step}')Word Ladder II: Aufgabenstellung
Word Ladder II (LeetCode 126): Gegeben sind ein Startwort, ein Endwort und eine Wortliste. Finden Sie alle kürzesten Transformationsfolgen vom Start- zum Endwort. In jedem Schritt wird genau ein Zeichen verändert, und jedes Zwischenwort muss in der Wortliste enthalten sein. Die Aufgabe ist deutlich schwieriger als Word Ladder I (dort wird nur ein kürzester Pfad gefunden), weil Sie alle optimalen Pfade aufzählen müssen.
Beispiel: beginWord='hit', endWord='cog', wordList=['hot','dot','dog','lot','log','cog'] → [['hit','hot','dot','dog','cog'],['hit','hot','lot','log','cog']]. Beide haben die Länge 5.
# Word Ladder II problem breakdown
begin_word = 'hit'
end_word = 'cog'
word_list = ['hot','dot','dog','lot','log','cog']
# What we need:
# 1. Build a graph: word -> set of words that differ by one character
# 2. BFS to find the MINIMUM number of steps (shortest path distance)
# 3. DFS/backtracking to enumerate ALL paths of that minimum length
# Key insight: BFS finds shortest distance; DFS reconstructs all shortest paths
# Two-phase approach:
print('Phase 1: BFS from begin_word to find min distance to each word')
print('Phase 2: DFS/backtrack from end_word using only edges that decrease distance')
print()
print(f'Input: {begin_word} -> {end_word}')
print(f'Word list: {word_list}')
print('Expected: [[hit,hot,dot,dog,cog],[hit,hot,lot,log,cog]]')Word Ladder II: BFS-Phase
Führen Sie in Phase 1 eine BFS Ebene für Ebene vom Startwort aus. Auf jeder Ebene finden wir alle Nachbarn (Wörter, die sich in einem Zeichen unterscheiden). Wir speichern die Ebene (die Entfernung vom Start), auf der jedes Wort zum ersten Mal erreicht wird. Wir brechen NICHT ab, sobald wir das Endwort erreichen, sondern fahren bis zum Ende der Ebene fort, in der end_word gefunden wurde, damit wir alle kürzesten Pfade erfassen.
Entscheidend ist, dass wir ein parents-Dictionary aufbauen, das jedes Wort auf die Menge der Wörter abbildet, die ihm in einem kürzesten Pfad vorausgehen können. Dieser Graph wird in Phase 2 für das Backtracking verwendet.
from collections import defaultdict, deque
def find_parents(begin, end, word_set):
parents = defaultdict(set)
layer = {begin}
found = False
while layer and not found:
next_layer = set()
for word in layer:
for i in range(len(word)):
for c in 'abcdefghijklmnopqrstuvwxyz':
new_word = word[:i] + c + word[i+1:]
if new_word in word_set and new_word not in parents:
next_layer.add(new_word)
parents[new_word].add(word)
if new_word == end:
found = True
layer = next_layer
return parents if found else {}
words = {'hot','dot','dog','lot','log','cog'}
parents = find_parents('hit', 'cog', words)
print('Parents map (which words can precede each word):')
for word, preds in sorted(parents.items()):
print(f' {word}: {preds}')Word Ladder II: DFS-Backtracking-Phase
Verwenden Sie in Phase 2 DFS-Backtracking vom Endwort aus und folgen Sie der parents-Zuordnung in umgekehrter Richtung. Wir bauen die Pfade vom Ende zum Anfang auf und drehen sie anschließend um. Wenn wir das Startwort erreichen, haben wir einen vollständigen kürzesten Pfad gefunden. Die parents-Zuordnung garantiert, dass alle gefundenen Pfade die minimale Länge haben – wir können nicht auf einen längeren Pfad „abweichen“.
Dieser Ansatz in zwei Phasen (BFS für die Ebenen, DFS für die Pfadrekonstruktion) ist die Standardlösung. Die BFS läuft in O(n × L × 26), wobei n der Größe der Wortliste und L der Wortlänge entspricht, zusätzlich zur DFS mit O(K × L), wobei K die Anzahl der kürzesten Pfade ist.
def find_ladders(beginWord, endWord, wordList):
word_set = set(wordList)
if endWord not in word_set:
return []
# Phase 1: BFS to build parents map
parents = defaultdict(set)
layer = {beginWord}
found = False
visited = {beginWord}
while layer and not found:
next_layer = set()
for word in layer:
for i in range(len(word)):
for c in 'abcdefghijklmnopqrstuvwxyz':
nw = word[:i] + c + word[i+1:]
if nw in word_set and nw not in visited:
next_layer.add(nw)
parents[nw].add(word)
if nw == endWord: found = True
visited |= next_layer
layer = next_layer
# Phase 2: DFS backtrack from endWord to beginWord
result = []
def dfs(word, path):
if word == beginWord:
result.append(path[::-1])
return
for parent in parents[word]:
dfs(parent, path + [parent])
dfs(endWord, [endWord])
return result
print(find_ladders('hit','cog',['hot','dot','dog','lot','log','cog']))Alien Dictionary: Aufgabenstellung
Alien Dictionary (LeetCode 269): Gegeben ist eine Liste von Wörtern, die in einer fremden Sprache lexikografisch sortiert ist. Bestimmen Sie die Reihenfolge der Zeichen in dieser Sprache. Geben Sie die Zeichenreihenfolge als String zurück. Falls keine gültige Reihenfolge existiert (die Vorgaben widersprüchlich sind), geben Sie einen leeren String zurück.
Beispiel: ['wrt','wrf','er','ett','rftt'] → 'wertf'. Durch den Vergleich benachbarter Wörter erhalten wir: 't' < 'f' (aus wrt und wrf), 'w' < 'e' (aus wrt und er), 'r' < 't' (aus er und ett), 'e' < 'r' (aus ett und rftt). Dies ist eine topologische Sortierung dieser Vorgaben für die Zeichenreihenfolge.
words = ['wrt', 'wrf', 'er', 'ett', 'rftt']
# Compare adjacent pairs to extract ordering:
# wrt vs wrf: first diff at index 2: t < f (t comes before f)
# wrf vs er: first diff at index 0: w < e (w comes before e)
# er vs ett: first diff at index 1: r < t (r comes before t)
# ett vs rftt:first diff at index 0: e < r (e comes before r)
ordering_constraints = [
('t', 'f', 'from wrt vs wrf'),
('w', 'e', 'from wrf vs er'),
('r', 't', 'from er vs ett'),
('e', 'r', 'from ett vs rftt'),
]
print('Ordering constraints extracted from adjacent word pairs:')
for a, b, source in ordering_constraints:
print(f' {a} -> {b} ({source})')
print('\nThis is a directed graph: find topological order = alien alphabet order')Alien Dictionary: Erstellen des Graphen
Der erste Schritt ist das Extrahieren von Vorgaben: Vergleichen Sie jedes benachbarte Wortpaar, finden Sie das erste unterschiedliche Zeichen und fügen Sie eine gerichtete Kante vom kleineren zum größeren Zeichen hinzu. Wenn ein Wort ein Präfix des nächsten Wortes, aber länger ist (zum Beispiel „abc“ vor „ab“), ist die Eingabe ungültig – geben Sie sofort einen leeren String zurück.
Alle Zeichen, die in der Wortliste vorkommen, sind Knoten im Graphen, auch wenn für sie keine Reihenfolge vorgegeben ist. Diese isolierten Knoten können an beliebiger Stelle in der endgültigen Reihenfolge stehen.
from collections import defaultdict
def build_alien_graph(words):
adj = defaultdict(set) # char -> set of chars that come after it
in_degree = {c: 0 for word in words for c in word}
for i in range(len(words) - 1):
w1, w2 = words[i], words[i+1]
min_len = min(len(w1), len(w2))
found_diff = False
for j in range(min_len):
if w1[j] != w2[j]:
if w2[j] not in adj[w1[j]]: # avoid duplicate edges
adj[w1[j]].add(w2[j])
in_degree[w2[j]] += 1
found_diff = True
break
if not found_diff and len(w1) > len(w2):
return {}, {} # invalid: 'abc' before 'ab'
return adj, in_degree
words = ['wrt', 'wrf', 'er', 'ett', 'rftt']
adj, in_degree = build_alien_graph(words)
print('Adjacency list (directed):', {k: list(v) for k, v in adj.items()})
print('In-degrees:', in_degree)Alien Dictionary: Topologische Sortierung
Sobald der Graph erstellt ist, wenden Sie Khans topologische BFS-Sortierung an: Initialisieren Sie eine Warteschlange mit allen Zeichen mit Eingangsgrad 0 (ohne Vorgänger). Verarbeiten Sie jedes Zeichen und verringern Sie den Eingangsgrad seiner Nachfolger. Sobald der Eingangsgrad eines Nachfolgers 0 erreicht, fügen Sie ihn in die Warteschlange ein. Sammeln Sie die Zeichen in der Reihenfolge ihrer Verarbeitung – dies ist die alphabetische Reihenfolge der fremden Sprache.
Wenn das Ergebnis alle Zeichen enthält, haben wir eine gültige Reihenfolge. Wenn es weniger Zeichen als erwartet enthält, gibt es einen Zyklus – die Vorgaben sind widersprüchlich und wir geben einen leeren String zurück.
from collections import deque, defaultdict
def alien_order(words):
adj = defaultdict(set)
in_degree = {c: 0 for word in words for c in word}
for i in range(len(words) - 1):
w1, w2 = words[i], words[i + 1]
min_len = min(len(w1), len(w2))
found = False
for j in range(min_len):
if w1[j] != w2[j]:
if w2[j] not in adj[w1[j]]:
adj[w1[j]].add(w2[j])
in_degree[w2[j]] += 1
found = True; break
if not found and len(w1) > len(w2):
return '' # invalid: 'abc' before 'ab'
# Kahn's BFS topological sort
queue = deque([c for c in in_degree if in_degree[c] == 0])
result = []
while queue:
c = queue.popleft()
result.append(c)
for neighbor in sorted(adj[c]): # sort for determinism
in_degree[neighbor] -= 1
if in_degree[neighbor] == 0:
queue.append(neighbor)
return ''.join(result) if len(result) == len(in_degree) else ''
print(alien_order(['wrt','wrf','er','ett','rftt'])) # e.g., 'wertf'
print(alien_order(['z','x'])) # 'zx'
print(alien_order(['z','x','z'])) # '' (cycle z->x->z)Umgang mit Sonderfällen: Beide Aufgaben
Word Ladder II und Alien Dictionary enthalten einige subtile Sonderfälle, die bei fehlender Behandlung zu falschen Ergebnissen führen:
- Word Ladder II: beginWord und endWord sind identisch (geben Sie
[[beginWord]]beziehungsweise einen Pfad der Länge 1 zurück). endWord ist nicht in wordList enthalten (geben Sie eine leere Ausgabe zurück). Es existiert kein Pfad (geben Sie eine leere Ausgabe zurück). - Alien Dictionary: doppelte Wörter (keine Vorgabe extrahieren). Ein einzelnes Wort (alle eindeutigen Zeichen zurückgeben). Zyklus in den Vorgaben (geben Sie
''zurück). Ein Wort ist ein längeres Präfix des nächsten Wortes (ungültige Eingabe, geben Sie''zurück). Alle Zeichen sind isoliert (geben Sie eine beliebige Reihenfolge zurück).
# Edge case tests for Word Ladder II
def test_word_ladder_edge_cases():
from collections import defaultdict
def find_ladders(begin, end, word_list):
# [abbreviated implementation for testing]
if end not in word_list: return []
if begin == end: return [[begin]]
return [] # placeholder
tests = [
('hit', 'cog', ['hot','dot','dog','lot','log'], []), # no path (cog missing)
('hit', 'hit', ['hit'], [['hit']]), # begin==end
('a', 'c', ['a','b','c'], [['a','c']]), # short words
]
for begin, end, wl, expected in tests:
result = find_ladders(begin, end, wl)
print(f'{begin}->{end}: result={result}')
# Edge case tests for Alien Dictionary
def test_alien_edge_cases():
from collections import defaultdict, deque
# (using alien_order from previous scene)
tests = [
(['abc', 'ab'], ''), # 'abc' before 'ab' = invalid
(['a'], 'a'), # single word
(['z','z'], 'z'), # duplicate: no constraint
]
print('Alien dictionary edge cases:')
for words, expected in tests:
print(f' {words} -> expected: "{expected}"')
test_word_ladder_edge_cases()
test_alien_edge_cases()Komplexitätsanalyse: Beide Aufgaben
Komplexität von Word Ladder II: Die BFS-Phase läuft in O(n × L × 26), wobei n für die Wörter in der Liste und L für die Wortlänge steht. Für jedes Wort auf jeder BFS-Ebene erzeugen wir 26L mögliche Wörter und prüfen ihre Zugehörigkeit zur Wortmenge (O(1) pro Prüfung). Die DFS-Phase hat die Komplexität O(K × L), wobei K die Anzahl der kürzesten Pfade ist (theoretisch kann sie exponentiell sein).
Komplexität von Alien Dictionary: Das Erstellen des Graphen hat die Komplexität O(C), wobei C der Gesamtzahl der Zeichen in allen Wörtern entspricht. Die topologische Sortierung hat die Komplexität O(V + E), wobei V für die eindeutigen Zeichen und E für die Vorgaben zur Reihenfolge steht. Insgesamt ergibt sich O(C), also O(der Gesamtzahl der Zeichen in der Eingabe).
# Complexity analysis for both problems
complexities = [
{
'problem': 'Word Ladder II',
'time': 'O(n * L * 26) BFS + O(K * L) DFS backtracking',
'space': 'O(n * L) for word set + parents map',
'notes': 'K (number of shortest paths) can be exponential in pathological cases',
},
{
'problem': 'Alien Dictionary',
'time': 'O(C) where C = total characters in all words',
'space': 'O(V + E) for adjacency list',
'notes': 'V <= 26 (alphabet), E <= V^2 = 676; often treated as O(C) total',
},
]
for c in complexities:
print(f'{c["problem"]}:')
print(f' Time: {c["time"]}')
print(f' Space: {c["space"]}')
print(f' Notes: {c["notes"]}')
print()Musterzusammenfassung: Zwei wiederverwendbare Vorlagen
Beide Aufgaben vermitteln wiederverwendbare Muster. Word Ladder II = BFS für Distanzen + DFS für die Pfadrekonstruktion: Dieses Muster kommt überall dort vor, wo Sie alle kürzesten Pfade in einem ungewichteten Graphen benötigen. Erstellen Sie die parents-Zuordnung während der BFS und führen Sie anschließend vom Ziel zum Start ein Backtracking durch.
Alien Dictionary = Extrahieren von Kanten + topologische Sortierung: Dieses Muster kommt überall dort vor, wo Sie eine sortierte Folge erhalten und die zugrunde liegenden Regeln für die Reihenfolge ableiten müssen. Extrahieren Sie gerichtete Vorgaben aus benachbarten Paaren und wenden Sie anschließend Khans Algorithmus an. Geben Sie bei der Erkennung eines Zyklus (unmögliche Reihenfolge) '' zurück.
# Pattern templates
print('Template 1: All Shortest Paths in Unweighted Graph')
template_1 = '''
1. BFS from source, recording parents[node] = set of nodes that lead to node
2. Continue each BFS level fully (do not stop at first endNode reach)
3. DFS backtrack from endNode, following parents map
4. Reverse each path found (built end->start, need start->end)
'''
print(template_1)
print('Template 2: Infer Ordering from Sorted Sequence')
template_2 = '''
1. Compare adjacent pairs, extract first differing element as directed constraint
2. Build adjacency list + in-degree map
3. Check for invalid input (prefix longer than successor)
4. Kahn's BFS topological sort
5. If result length < number of nodes => cycle => return invalid
'''
print(template_2)Sicherheit bei schwierigen Aufgaben entwickeln
Schwierige Aufgaben wirken zunächst unmöglich, werden mit dem richtigen Denkmodell aber lösbar. Die wichtigsten Erkenntnisse:
- Trennen Sie Zuständigkeiten: Lösen Sie jede Teilaufgabe unabhängig, bevor Sie sie verbinden
- Kennen Sie Ihre Bausteine: BFS/DFS, topologische Sortierung, Dijkstra, DP-Tabellen – schwierige Aufgaben kombinieren diese auf nicht offensichtliche Weise
- Beginnen Sie mit Beispielen: Gehen Sie die Aufgabe anhand eines kleinen Beispiels manuell durch, um die zugrunde liegende Struktur zu erkennen
- Überprüfen Sie Teilaufgaben: Geben Sie nach der Implementierung von Phase 1 (Erstellen des Graphen) den Graphen aus und überprüfen Sie ihn manuell, bevor Sie mit Phase 2 fortfahren
# Hard problem confidence-building practice plan
practice_plan = [
('Week 1', 'BFS/DFS fundamentals', ['Number of Islands', 'Clone Graph', 'Word Ladder I']),
('Week 2', 'Topological sort', ['Course Schedule I & II', 'Alien Dictionary (easy)']),
('Week 3', 'All-paths problems', ['All Paths to Target', 'Word Ladder II (hard)']),
('Week 4', 'Hard combos', ['Minimum Window Substring', 'Serialize/Deserialize Tree']),
]
print('4-week hard problem practice plan:')
for week, theme, problems in practice_plan:
print(f'\n{week} — {theme}:')
for p in problems:
print(f' - {p}')
print('\nAfter each problem, write:')
print(' 1. The pattern it belongs to')
print(' 2. The 2-3 key sub-problems')
print(' 3. One insight you would not have had before solving it')Kurztest
Testen Sie Ihr Verständnis der Konzepte aus der Lektion „Data Structures & Algorithms — Coding Interview Prep“.
Zusammenfassung der Lektion
In dieser Lektion haben Sie gelernt: Word Ladder II verwendet BFS, um eine parents-Zuordnung aller Vorgänger kürzester Pfade zu erstellen, und anschließend DFS-Backtracking, um durch das Folgen der parents-Zuordnung vom Ende zum Anfang alle kürzesten Pfade aufzuzählen, Alien Dictionary extrahiert gerichtete Vorgaben aus benachbarten Wortpaaren und verwendet Khans topologische Sortierung, um die Zeichen zu ordnen, wobei bei der Erkennung eines Zyklus ein leerer String zurückgegeben wird und schwierige Aufgaben in mehrere Teilaufgaben zerlegt werden – das Erstellen des Graphen, das Ermitteln von Distanzen und das Rekonstruieren von Pfaden –, die jeweils unabhängig mit vertrauten Algorithmen gelöst werden. Sie haben nun den vollständigen DSA-Interview-Prep-Kurs abgeschlossen. Wenden Sie alle Muster und Techniken dieses Lernpfads mit Zuversicht in Ihren Vorstellungsgesprächen an.
Häufig gestellte Fragen
Ist die Lektion „Durchläufe schwieriger Aufgaben: Word Ladder II und Alien Dictionary“ kostenlos?
Ja — der vollständige Text von „Durchläufe schwieriger Aufgaben: Word Ladder II und Alien Dictionary“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Coding Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Durchläufe schwieriger Aufgaben: Word Ladder II und Alien Dictionary“?
Bearbeiten Sie zwei schwierige Aufgaben von Anfang bis Ende – word-ladder-II mit BFS und Backtracking sowie alien-dictionary mit topologischer Sortierung – mit vollständiger Erklärung. Du übst Coding Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Coding Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. Coding Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Durchläufe schwieriger Aufgaben: Word Ladder II und Alien Dictionary“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Coding Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede Coding Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Spickzettel zur Mustererkennung
- Zeitlich begrenztes Probeinterview: einfache und mittelschwere Aufgaben
- Umgang mit Sonderfällen und Kommunikation im Interview
- Durchläufe schwieriger Aufgaben: Word Ladder II und Alien Dictionary