Zor Problem Çözümleri: Sözcük Merdiveni II ve Uzaylı Sözlüğü
İki zor problemi baştan sona ele alın: BFS + geri izlemeyle sözcük-merdiveni-II ve topolojik sıralamayla uzaylı-sözlüğü; tüm açıklamalarla birlikte.
Zor Problem Çözümleri: Sözcük Merdiveni II ve Uzaylı Sözlüğü, CoddyKit'te ücretsiz bir DSA Interview Prep dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, DSA Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. DSA Interview Prep kursu toplamda 4 dersten oluşur.
Zor Problemler Neden Farklıdır
Zor LeetCode problemleri, orta zorluktaki problemlerden iki temel açıdan ayrılır: (1) iki veya daha fazla algoritmik tekniği birleştirmenizi gerektirirler ve (2) en iyi çözüm çoğu zaman yalnızca problem açıklamasından anlaşılmaz — yüzeydeki açıklamanın ardındaki grafiği veya DP yapısını görmeniz gerekir. Kelime Merdiveni II ve Uzaylı Sözlüğü, FAANG mülakatlarında tekrar tekrar karşılaşılan klasik zor problemlerdir.
Zor problemlere yaklaşımınız şöyle olmalıdır: eksiksiz çözümü en baştan görmeye çalışmayın. Bunun yerine problemi alt problemlere ayırın, her alt problemin yapısını belirleyin, her birini bağımsız olarak çözün ve sonra bunları birleştirin. Bu modüler düşünme biçimi, baskı altında zor problem çözmenin anahtarıdır.
# 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}')Kelime Merdiveni II: Problem Açıklaması
Kelime Merdiveni II (LeetCode 126): Bir başlangıç sözcüğü, bir bitiş sözcüğü ve bir sözcük listesi verildiğinde, başlangıçtan bitişe giden tüm en kısa dönüşüm dizilerini bulun. Her adımda tam olarak bir karakter dönüştürülmeli ve her ara sözcük sözcük listesinde bulunmalıdır. Bu, yalnızca bir en kısa yol bulan Kelime Merdiveni I'den kesinlikle daha zordur; çünkü en iyi yolların tümünü listelemeniz gerekir.
Örnek: beginWord='hit', endWord='cog', wordList=['hot','dot','dog','lot','log','cog'] → [['hit','hot','dot','dog','cog'],['hit','hot','lot','log','cog']]. Her ikisinin de uzunluğu 5'tir.
# 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]]')Kelime Merdiveni II: BFS Aşaması
1. Aşamada başlangıç sözcüğünden başlayarak seviyeleri tek tek BFS ile tarayın. Her seviyede tüm komşuları, yani tek karakteri farklı olan sözcükleri, buluruz. Her sözcüğe ilk kez ulaşıldığı seviyeyi (başlangıçtan uzaklığını) kaydederiz. Bitiş sözcüğüne ulaştığımızda NOT durmayız — tüm en kısa yolları keşfettiğimizden emin olmak için bitiş sözcüğünün bulunduğu seviyenin sonuna kadar devam ederiz.
En önemli nokta, her sözcüğü herhangi bir en kısa yolda kendisinden önce gelebilecek sözcükler kümesine eşleyen bir parents sözlüğü oluşturmamızdır. 2. Aşamada geri izleme için kullanacağımız grafik budur.
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}')Kelime Merdiveni II: DFS Geri İzleme Aşaması
2. Aşamada bitiş sözcüğünden başlayarak, parents eşlemesini ters yönde izleyen DFS geri izlemesini kullanın. Yolları bitişten başlangıca doğru oluşturur, ardından ters çeviririz. Başlangıç sözcüğüne ulaştığımızda eksiksiz bir en kısa yol bulmuş oluruz. Ebeveyn eşlemesi, bulunan tüm yolların en kısa uzunlukta olmasını garanti eder — daha uzun bir yola "sapamayız".
Bu iki aşamalı yaklaşım (seviyeler için BFS, yolun yeniden oluşturulması için DFS) standart çözümdür ve BFS için n = sözcük listesi boyutu, L = sözcük uzunluğu olmak üzere O(n × L × 26) sürede çalışır; buna ek olarak K = en kısa yolların sayısı olmak üzere DFS için O(K × L) süre gerekir.
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']))Uzaylı Sözlüğü: Problem Açıklaması
Uzaylı Sözlüğü (LeetCode 269): uzaylı bir dilde sözlük sırasına göre sıralanmış bir sözcük listesi verildiğinde, o dildeki karakterlerin sırasını belirleyin. Karakter sıralamasını bir dize olarak döndürün. Geçerli bir sıralama yoksa (çelişki varsa) boş dize döndürün.
Örnek: ['wrt','wrf','er','ett','rftt'] → 'wertf'. Ardışık sözcükleri karşılaştırarak: wrt ile wrf karşılaştırmasından 't' < 'f', wrt ile er karşılaştırmasından 'w' < 'e', er ile ett karşılaştırmasından 'r' < 't' ve ett ile rftt karşılaştırmasından 'e' < 'r' sonucunu elde ederiz. Bu, söz konusu karakter sıralaması kısıtlarının topolojik sıralamasıdır.
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')Uzaylı Sözlüğü: Grafiği Oluşturma
İlk adım kısıtları çıkarmaktır: her ardışık sözcük çiftini karşılaştırın, ilk farklı karakteri bulun ve küçük karakterden büyük karaktere yönlü bir kenar eklemek için add işlemini kullanın. Bir sözcük kendisinden sonraki sözcüğün önekiyse ancak daha uzunsa (örneğin 'abc' sözcüğü 'ab' sözcüğünden önce geliyorsa), girdi geçersizdir — hemen boş dize döndürün.
Sözcük listesinde görünen tüm karakterler, herhangi bir sıralama kısıtları olmasa bile grafiğin düğümleridir. Bu yalıtılmış düğümler son sıralamada herhangi bir yerde bulunabilir.
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)Uzaylı Sözlüğü: Topolojik Sıralama
Grafik oluşturulduktan sonra Kahn'ın BFS topolojik sıralamasını uygulayın: giriş derecesi 0 olan (ön koşulu bulunmayan) tüm karakterlerle bir kuyruk başlatın. Her karakteri işleyin ve ardıllarının giriş derecesini azaltın. Bir ardılın giriş derecesi 0'a ulaştığında onu kuyruğa ekleyin. Karakterleri işlenme sırasına göre toplayın — bu, uzaylı alfabesindeki sıralamadır.
Sonuç tüm karakterleri içeriyorsa geçerli bir sıralamamız vardır. Beklenenden daha az karakter varsa bir döngü vardır — kısıtlar çelişkilidir ve boş dize döndürürüz.
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)Uç Durumları Ele Alma: Her İki Problem
Hem Kelime Merdiveni II hem de Uzaylı Sözlüğü, ele alınmadıklarında yanlış sonuçlara yol açan ince ayrıntılı uç durumlara sahiptir:
- Kelime Merdiveni II: beginWord ve endWord aynıdır (
[[beginWord]]veya 1 uzunluğunda bir sonuç döndürün). endWord, wordList içinde değildir (boş döndürün). Hiçbir yol yoktur (boş döndürün). - Uzaylı Sözlüğü: duplicate sözcükler (kısıt çıkarılmaz). Tek sözcük (tüm farklı karakterleri döndürün). Kısıtlarda döngü (boş dize döndürün). Bir sözcük, kendisinden sonraki sözcüğün daha uzun bir önekidir (geçersiz girdi, boş dize döndürün). Tüm karakterler yalıtıktır (herhangi bir sırayı döndürün).
# 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()Karmaşıklık Analizi: Her İki Problem
Kelime Merdiveni II karmaşıklığı: BFS aşaması, n = listedeki sözcük sayısı ve L = sözcük uzunluğu olmak üzere O(n × L × 26) sürede çalışır. Her BFS seviyesinde her sözcük için 26L aday sözcük üretir ve sözcük kümesinde bulunup bulunmadıklarını kontrol ederiz (her kontrol O(1) süresindedir). DFS aşaması, K = en kısa yolların sayısı olmak üzere O(K × L) sürede çalışır (teoride üstel olabilir).
Uzaylı Sözlüğü karmaşıklığı: Grafiği oluşturmak, tüm sözcüklerdeki toplam karakter sayısı C olmak üzere O(C) sürede gerçekleşir. Topolojik sıralama, V = farklı karakterlerin sayısı ve E = sıralama kısıtları olmak üzere O(V + E) sürede çalışır. Toplam karmaşıklık O(C), yani girdideki toplam karakter sayısı bakımından O(toplam karakter sayısı) olur.
# 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()Örüntü Özeti: Yeniden Kullanılabilir İki Şablon
Her iki problem de yeniden kullanılabilir örüntüler öğretir. Kelime Merdiveni II = uzaklıklar için BFS + yolun yeniden oluşturulması için DFS: bu örüntü, ağırlıksız bir grafikte tüm en kısa yollar gerektiğinde ortaya çıkar. BFS sırasında ebeveyn eşlemesini oluşturun, ardından hedeften kaynağa doğru geri izleyin.
Uzaylı Sözlüğü = kenar çıkarma + topolojik sıralama: bu örüntü, sıralanmış bir dizi verildiğinde ve temelindeki sıralama kurallarını çıkarmanız gerektiğinde ortaya çıkar. Ardışık çiftlerden yönlü kısıtları çıkarın, ardından Kahn algoritmasını uygulayın. Döngü tespitinde boş dize döndürün (sıralama mümkün değildir).
# 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)Zor Problemlerde Güven Geliştirmek
Zor problemler ilk başta imkânsız görünür, ancak doğru zihinsel modelle yaklaşılabilir hâle gelir. Temel çıkarımlar şunlardır:
- Sorumlulukları birbirinden ayırın: her alt problemi birleştirmeden önce bağımsız olarak çözün
- Temel yapı taşlarınızı bilin: BFS/DFS, topolojik sıralama, Dijkstra, DP tabloları — zor problemler bunları açıkça görülmeyen biçimlerde birleştirir
- Örneklerle başlayın: temelindeki yapıyı keşfetmek için problemi küçük bir örnekle elle adım adım izleyin
- Alt problemleri doğrulayın: 1. Aşamayı (grafiği oluşturmayı) uyguladıktan sonra grafiği yazdırın ve 2. Aşamaya geçmeden önce elle doğrulayın
# 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')Kısa Kontrol
Bu dersteki Veri Yapıları ve Algoritmalar — Kodlama Mülakatı Hazırlığı kavramlarını ne kadar anladığınızı sınayın.
Ders Özeti
Bu derste şunları öğrendiniz: Kelime Merdiveni II, tüm en kısa yol öncüllerinin bulunduğu bir parents eşlemesi oluşturmak için BFS kullanır; ardından parents eşlemesini bitişten başlangıca doğru izleyerek tüm en kısa yolları listelemek için DFS geri izlemesini kullanır, Uzaylı Sözlüğü, ardışık sözcük çiftlerinden yönlü kısıtları çıkarır ve karakterleri sıralamak için Kahn'ın topolojik sıralamasını uygular; döngü tespit edildiğinde boş dize döndürür ve zor problemler birden fazla alt probleme ayrılır — grafiği oluşturma, uzaklıkları bulma ve yolları yeniden oluşturma — bunların her biri bilinen algoritmalarla bağımsız olarak çözülür. DSA Mülakat Hazırlığı kursunun tamamını artık bitirdiniz. Bu izdeki her örüntüyü ve tekniği mülakatlarınızda güvenle uygulayın.
Sıkça Sorulan Sorular
“Zor Problem Çözümleri: Sözcük Merdiveni II ve Uzaylı Sözlüğü” dersi ücretsiz mi?
Evet — “Zor Problem Çözümleri: Sözcük Merdiveni II ve Uzaylı Sözlüğü” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve DSA Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. DSA Interview Prep kursu toplamda 4 dersten oluşur.
“Zor Problem Çözümleri: Sözcük Merdiveni II ve Uzaylı Sözlüğü” dersinde ne öğreneceğim?
İki zor problemi baştan sona ele alın: BFS + geri izlemeyle sözcük-merdiveni-II ve topolojik sıralamayla uzaylı-sözlüğü; tüm açıklamalarla birlikte. DSA Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
DSA Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te DSA Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Zor Problem Çözümleri: Sözcük Merdiveni II ve Uzaylı Sözlüğü” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu DSA Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her DSA Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Örüntü Tanıma Kopya Kâğıdı
- Süreli Deneme Mülakatı: Kolay ve Orta Düzey Problemler
- Kenar Durumlarını Ele Alma ve Mülakatçıyla İletişim
- Zor Problem Çözümleri: Sözcük Merdiveni II ve Uzaylı Sözlüğü