Pembahasan Masalah Sulit: Word Ladder II dan Alien Dictionary
Tuntaskan dua masalah sulit dari awal hingga akhir—word-ladder-II dengan BFS + penelusuran mundur dan alien-dictionary dengan pengurutan topologis—disertai penjelasan lengkap
Pembahasan Masalah Sulit: Word Ladder II dan Alien Dictionary adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.
Mengapa Soal Sulit Berbeda
Soal LeetCode sulit berbeda dari soal tingkat sedang dalam dua hal utama: (1) soal-soal tersebut memerlukan penggabungan dua teknik algoritmik atau lebih, dan (2) solusi optimal sering kali tidak terlihat jelas hanya dari pernyataan soal—Anda harus melihat melampaui uraian permukaan untuk menemukan struktur graf atau DP yang mendasarinya. Tangga Kata II dan Kamus Alien adalah soal sulit klasik yang berulang kali muncul dalam wawancara FAANG.
Pendekatan untuk soal sulit: jangan mencoba melihat solusi lengkap sejak awal. Sebagai gantinya, pecah soal menjadi subsoal, kenali struktur setiap subsoal, selesaikan masing-masing secara mandiri, lalu hubungkan semuanya. Pola pikir modular ini adalah kunci untuk menyelesaikan soal sulit di bawah tekanan.
# 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}')Tangga Kata II: Pernyataan Soal
Tangga Kata II (LeetCode 126): Diberikan sebuah kata awal, kata akhir, dan daftar kata, temukan semua urutan transformasi terpendek dari awal hingga akhir. Setiap langkah mengubah tepat satu karakter, dan setiap kata perantara harus ada dalam daftar kata. Soal ini jauh lebih sulit daripada Tangga Kata I (yang hanya mencari satu jalur terpendek) karena Anda harus mencantumkan semua jalur optimal.
Contoh: beginWord='hit', endWord='cog', wordList=['hot','dot','dog','lot','log','cog'] → [['hit','hot','dot','dog','cog'],['hit','hot','lot','log','cog']]. Keduanya memiliki panjang 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]]')Tangga Kata II: Tahap BFS
Pada Tahap 1, jalankan BFS tingkat demi tingkat dari kata awal. Pada setiap tingkat, kita menemukan semua kata tetangga (kata yang berbeda satu karakter). Kita mencatat tingkat (jarak dari awal) saat setiap kata pertama kali dicapai. Kita TIDAK berhenti ketika mencapai kata akhir—kita melanjutkan hingga akhir tingkat tempat kata akhir ditemukan, untuk memastikan semua jalur terpendek ditelusuri.
Yang terpenting, kita membangun kamus parents yang memetakan setiap kata ke himpunan kata yang dapat mendahuluinya dalam jalur terpendek mana pun. Inilah graf yang kita gunakan pada Tahap 2 untuk penelusuran mundur.
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}')Tangga Kata II: Tahap Penelusuran Mundur DFS
Pada Tahap 2, gunakan penelusuran mundur DFS mulai dari kata akhir, dengan mengikuti peta parents secara terbalik. Kita membangun jalur dari akhir ke awal, lalu membalik urutannya. Ketika mencapai kata awal, kita telah menemukan jalur terpendek yang lengkap. Peta parents menjamin bahwa semua jalur yang ditemukan memiliki panjang minimum—kita tidak dapat 'menyimpang' ke jalur yang lebih panjang.
Pendekatan dua tahap ini (BFS untuk tingkat dan DFS untuk rekonstruksi jalur) adalah solusi standar dan berjalan dalam O(n × L × 26) untuk BFS, dengan n = ukuran daftar kata dan L = panjang kata, ditambah O(K × L) untuk DFS, dengan K = jumlah jalur terpendek.
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']))Kamus Alien: Pernyataan Soal
Kamus Alien (LeetCode 269): diberikan daftar kata yang diurutkan secara leksikografis dalam bahasa alien, tentukan urutan karakter dalam bahasa tersebut. Kembalikan urutan karakter sebagai sebuah teks. Jika tidak ada urutan yang valid (terdapat kontradiksi), kembalikan teks kosong.
Contoh: ['wrt','wrf','er','ett','rftt'] → 'wertf'. Dengan membandingkan kata-kata yang bersebelahan: 't' < 'f' (dari wrt dan wrf), 'w' < 'e' (dari wrt dan er), 'r' < 't' (dari er dan ett), 'e' < 'r' (dari ett dan rftt). Ini adalah pengurutan topologis dari kendala urutan karakter tersebut.
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')Kamus Alien: Membangun Graf
Langkah pertama adalah mengekstrak kendala: bandingkan setiap pasangan kata yang bersebelahan, temukan karakter pertama yang berbeda, lalu add sebuah sisi berarah dari karakter yang lebih kecil ke karakter yang lebih besar. Jika sebuah kata merupakan prefiks dari kata berikutnya tetapi lebih panjang (misalnya, 'abc' sebelum 'ab'), masukan tersebut tidak valid—segera kembalikan teks kosong.
Semua karakter yang muncul dalam daftar kata merupakan simpul di dalam graf, meskipun tidak memiliki kendala urutan. Simpul terisolasi ini dapat muncul di mana saja dalam urutan akhir.
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)Kamus Alien: Pengurutan Topologis
Setelah graf dibangun, terapkan pengurutan topologis BFS Kahn: inisialisasi antrean dengan semua karakter yang memiliki derajat masuk 0 (tanpa prasyarat). Proses setiap karakter dan kurangi derajat masuk penerusnya. Ketika derajat masuk seorang penerus mencapai 0, masukkan karakter tersebut ke antrean. Kumpulkan karakter sesuai urutan pemrosesan—inilah urutan alfabet alien.
Jika hasilnya memuat semua karakter, kita memiliki urutan yang valid. Jika jumlah karakternya lebih sedikit daripada yang diharapkan, terdapat siklus—kendalanya saling bertentangan dan kita mengembalikan teks kosong.
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)Menangani Kasus Batas: Kedua Soal
Tangga Kata II dan Kamus Alien sama-sama memiliki kasus batas yang rumit dan dapat menyebabkan jawaban salah jika tidak ditangani:
- Tangga Kata II: beginWord dan endWord sama (kembalikan
[[beginWord]]atau panjang 1). endWord tidak ada dalam wordList (kembalikan hasil kosong). Tidak ada jalur (kembalikan hasil kosong). - Kamus Alien: duplicate (jangan mengekstrak kendala). Satu kata (kembalikan semua karakter unik). Siklus dalam kendala (kembalikan ''). Sebuah kata merupakan prefiks yang lebih panjang daripada kata berikutnya (masukan tidak valid, kembalikan ''). Semua karakter terisolasi (kembalikan urutan apa pun).
# 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()Analisis Kompleksitas: Kedua Soal
Kompleksitas Tangga Kata II: tahap BFS berjalan dalam O(n × L × 26), dengan n = jumlah kata dalam daftar dan L = panjang kata. Untuk setiap kata di setiap tingkat BFS, kita menghasilkan 26L kata kandidat dan memeriksa keanggotaannya dalam himpunan kata (O(1) untuk setiap pemeriksaan). Tahap DFS berjalan dalam O(K × L), dengan K = jumlah jalur terpendek (secara teori dapat bersifat eksponensial).
Kompleksitas Kamus Alien: pembangunan graf berjalan dalam O(C), dengan C = jumlah seluruh karakter di semua kata. Pengurutan topologis berjalan dalam O(V + E), dengan V = jumlah karakter unik dan E = jumlah kendala urutan. Secara keseluruhan O(C), yaitu O(jumlah karakter dalam masukan).
# 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()Ringkasan Pola: Dua Templat yang Dapat Digunakan Kembali
Kedua soal ini mengajarkan pola yang dapat digunakan kembali. Tangga Kata II = BFS untuk jarak + DFS untuk rekonstruksi jalur: pola ini muncul setiap kali Anda memerlukan semua jalur terpendek dalam graf tak berbobot. Bangun peta induk selama BFS, lalu lakukan penelusuran mundur dari tujuan ke sumber.
Kamus Alien = ekstraksi sisi + pengurutan topologis: pola ini muncul setiap kali Anda diberikan urutan yang telah diurutkan dan harus menyimpulkan aturan urutan yang mendasarinya. Ekstrak kendala berarah dari pasangan yang bersebelahan, lalu terapkan algoritma Kahn. Kembalikan '' jika terdeteksi siklus (urutan tidak mungkin).
# 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)Membangun Kepercayaan Diri dalam Menyelesaikan Soal Sulit
Soal sulit awalnya tampak mustahil, tetapi menjadi lebih mudah didekati dengan model mental yang tepat. Wawasan utamanya:
- Pisahkan tanggung jawab: selesaikan setiap subsoal secara mandiri sebelum menghubungkannya
- Kenali komponen dasar Anda: BFS/DFS, pengurutan topologis, Dijkstra, tabel DP—soal sulit menggabungkan semua ini dengan cara yang tidak selalu terlihat
- Mulailah dengan contoh: telusuri soal secara manual menggunakan contoh kecil untuk menemukan struktur yang mendasarinya
- Verifikasi subsoal: setelah menerapkan Tahap 1 (pembangunan graf), tampilkan graf dan verifikasi secara manual sebelum melanjutkan ke Tahap 2
# 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')Pemeriksaan Singkat
Uji pemahaman Anda tentang konsep Struktur Data & Algoritma — Persiapan Wawancara Pemrograman dari pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini, Anda mempelajari bahwa: Tangga Kata II menggunakan BFS untuk membangun peta parents dari semua pendahulu jalur terpendek, lalu penelusuran mundur DFS untuk mencantumkan semua jalur terpendek dengan mengikuti parents dari akhir ke awal, Kamus Alien mengekstrak kendala berarah dari pasangan kata yang bersebelahan dan menerapkan pengurutan topologis Kahn untuk mengurutkan karakter, serta mengembalikan teks kosong ketika siklus terdeteksi, dan soal sulit dapat dipecah menjadi beberapa subsoal—membangun graf, menemukan jarak, dan merekonstruksi jalur—yang masing-masing diselesaikan secara mandiri menggunakan algoritma yang sudah dikenal. Anda kini telah menyelesaikan seluruh kursus Persiapan Wawancara DSA. Terapkan setiap pola dan teknik dari jalur pembelajaran ini dalam wawancara Anda dengan percaya diri.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pembahasan Masalah Sulit: Word Ladder II dan Alien Dictionary” gratis?
Ya — teks lengkap “Pembahasan Masalah Sulit: Word Ladder II dan Alien Dictionary” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding Interview Prep mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pembahasan Masalah Sulit: Word Ladder II dan Alien Dictionary”?
Tuntaskan dua masalah sulit dari awal hingga akhir—word-ladder-II dengan BFS + penelusuran mundur dan alien-dictionary dengan pengurutan topologis—disertai penjelasan lengkap Kamu berlatih Coding Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Coding Interview Prep?
Tidak diperlukan pengalaman sebelumnya. Coding Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Pembahasan Masalah Sulit: Word Ladder II dan Alien Dictionary” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Coding Interview Prep ini?
Ya. Setiap pelajaran Coding Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Ringkasan Pengenalan Pola
- Simulasi Wawancara Berwaktu: Masalah Mudah dan Menengah
- Menangani Kasus Tepi dan Komunikasi Peserta Wawancara
- Pembahasan Masalah Sulit: Word Ladder II dan Alien Dictionary