0Pricing
DSA Interview Prep · บทเรียน

การอธิบายปัญหายาก: Word Ladder II และ Alien Dictionary

ลงมือแก้ปัญหายากสองข้อแบบครบกระบวนการ ได้แก่ word-ladder-II ด้วย BFS + การย้อนกลับ และ alien-dictionary ด้วยการเรียงลำดับเชิงทอพอโลยี พร้อมคำอธิบายอย่างละเอียด

การอธิบายปัญหายาก: Word Ladder II และ Alien Dictionary เป็นบทเรียน DSA Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน DSA Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส DSA Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดโจทย์ยากจึงแตกต่าง

โจทย์ LeetCode ระดับยาก แตกต่างจากโจทย์ระดับปานกลางในสองด้านสำคัญ ได้แก่ (1) ต้องผสมผสานเทคนิคเชิงอัลกอริทึมตั้งแต่สองอย่างขึ้นไป และ (2) วิธีแก้ปัญหาที่เหมาะสมที่สุดมักไม่ชัดเจนจากคำอธิบายโจทย์เพียงอย่างเดียว — คุณต้องมองให้ทะลุคำอธิบายภายนอกเพื่อเห็นโครงสร้างกราฟหรือ DP ที่อยู่เบื้องหลัง บันไดคำ II และพจนานุกรมภาษาต่างดาวเป็นโจทย์ยากแบบคลาสสิกที่ปรากฏซ้ำในการสัมภาษณ์ของ FAANG

แนวทางสำหรับโจทย์ยากคือ อย่าพยายามมองหาวิธีแก้ปัญหาทั้งหมดตั้งแต่ต้น แต่ให้แบ่งโจทย์ออกเป็นโจทย์ย่อย ระบุโครงสร้างของแต่ละโจทย์ย่อย แก้แต่ละส่วนอย่างอิสระ แล้วจึงเชื่อมโยงเข้าด้วยกัน การคิดแบบแยกส่วนนี้คือกุญแจสำคัญในการแก้โจทย์ยากภายใต้ความกดดัน

# 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}')

บันไดคำ II: คำอธิบายโจทย์

บันไดคำ II (LeetCode 126): เมื่อกำหนดคำเริ่มต้น คำสิ้นสุด และรายการคำ ให้ค้นหาลำดับการแปลงที่สั้นที่สุดทั้งหมดจากคำเริ่มต้นไปยังคำสิ้นสุด ในแต่ละขั้นต้องเปลี่ยนอักขระเพียงหนึ่งตัว และคำระหว่างทางแต่ละคำต้องอยู่ในรายการคำ โจทย์นี้ยากกว่าบันไดคำ I อย่างชัดเจน (ซึ่งค้นหาเพียงเส้นทางที่สั้นที่สุดหนึ่งเส้นทาง) เพราะคุณต้องแจกแจงเส้นทางที่เหมาะสมที่สุดทั้งหมด

ตัวอย่าง: beginWord='hit', endWord='cog', wordList=['hot','dot','dog','lot','log','cog'] → [['hit','hot','dot','dog','cog'],['hit','hot','lot','log','cog']] ทั้งสองเส้นทางมีความยาว 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]]')

บันไดคำ II: ระยะ BFS

ในระยะที่ 1 ให้เรียกใช้ BFS ทีละระดับ จากคำเริ่มต้น ในแต่ละระดับ เราจะค้นหาคำข้างเคียงทั้งหมด (คำที่แตกต่างกันหนึ่งอักขระ) และบันทึก ระดับ (ระยะทางจากจุดเริ่มต้น) ที่แต่ละคำถูกพบเป็นครั้งแรก เรา NOT หยุดเมื่อพบคำสิ้นสุด แต่จะทำต่อจนจบระดับที่พบคำสิ้นสุด เพื่อให้แน่ใจว่าเราได้สำรวจเส้นทางที่สั้นที่สุดทั้งหมด

สิ่งสำคัญคือ เราสร้างพจนานุกรม parents ซึ่งจับคู่แต่ละคำกับกลุ่มคำที่สามารถอยู่ก่อนคำนั้นในเส้นทางที่สั้นที่สุดใด ๆ ได้ กราฟนี้จะถูกใช้ในระยะที่ 2 สำหรับการย้อนกลับตามเส้นทาง

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}')

บันไดคำ II: ระยะย้อนกลับด้วย DFS

ในระยะที่ 2 ให้ใช้ DFS พร้อมการย้อนกลับ จากคำสิ้นสุด โดยเดินตามแผนที่ parents ย้อนกลับ เราจะสร้างเส้นทางจากคำสิ้นสุดไปยังคำเริ่มต้น แล้วจึงกลับลำดับ เมื่อไปถึงคำเริ่มต้น เราจะได้เส้นทางที่สั้นที่สุดครบถ้วนหนึ่งเส้นทาง แผนที่บรรพบุรุษรับประกันว่าเส้นทางทั้งหมดที่พบมีความยาวต่ำสุด — เราไม่สามารถ “เบี่ยงเส้นทาง” ไปยังเส้นทางที่ยาวกว่าได้

แนวทางสองระยะนี้ (ใช้ BFS สำหรับระดับ และใช้ DFS สำหรับสร้างเส้นทางกลับคืน) เป็นวิธีมาตรฐาน และมีความซับซ้อน O(n × L × 26) สำหรับ BFS เมื่อ n = ขนาดรายการคำ และ L = ความยาวคำ รวมกับ O(K × L) สำหรับ DFS เมื่อ K = จำนวนเส้นทางที่สั้นที่สุด

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']))

พจนานุกรมภาษาต่างดาว: คำอธิบายโจทย์

พจนานุกรมภาษาต่างดาว (LeetCode 269): เมื่อกำหนดรายการคำที่เรียงตามลำดับพจนานุกรมในภาษาต่างดาว ให้ระบุลำดับอักขระในภาษานั้น แล้วคืนค่าลำดับอักขระเป็นสตริง หากไม่มีลำดับที่ถูกต้อง (มีข้อขัดแย้ง) ให้คืนค่าสตริงว่าง

ตัวอย่าง: ['wrt','wrf','er','ett','rftt'] → 'wertf' เมื่อเปรียบเทียบคำที่อยู่ติดกัน: 't' < 'f' (จาก wrt กับ wrf), 'w' < 'e' (จาก wrt กับ er), 'r' < 't' (จาก er กับ ett), 'e' < 'r' (จาก ett กับ rftt) นี่คือการเรียงลำดับเชิงทอพอโลยีของข้อจำกัดเกี่ยวกับลำดับอักขระเหล่านี้

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')

พจนานุกรมภาษาต่างดาว: การสร้างกราฟ

ขั้นตอนแรกคือ การดึงข้อจำกัด: เปรียบเทียบคำแต่ละคู่ที่อยู่ติดกัน ค้นหาอักขระตัวแรกที่แตกต่างกัน แล้วเพิ่มเส้นเชื่อมแบบมีทิศทางจากอักขระที่เล็กกว่าไปยังอักขระที่ใหญ่กว่า หากคำหนึ่งเป็นคำนำหน้าของคำถัดไปแต่มีความยาวมากกว่า (เช่น 'abc' อยู่ก่อน 'ab') ข้อมูลนำเข้าจะไม่ถูกต้อง — ให้คืนค่าสตริงว่างทันที

อักขระทั้งหมดที่ปรากฏในรายการคำจะเป็นโหนดในกราฟ แม้จะไม่มีข้อจำกัดด้านลำดับก็ตาม โหนดโดดเดี่ยวเหล่านี้สามารถปรากฏที่ใดก็ได้ในลำดับสุดท้าย

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)

พจนานุกรมภาษาต่างดาว: การเรียงลำดับเชิงทอพอโลยี

เมื่อสร้างกราฟแล้ว ให้ใช้ การเรียงลำดับเชิงทอพอโลยีด้วย BFS ของ Kahn: เริ่มต้นคิวด้วยอักขระทั้งหมดที่มีดีกรีขาเข้าเป็น 0 (ไม่มีข้อกำหนดก่อนหน้า) ประมวลผลอักขระแต่ละตัว แล้วลดดีกรีขาเข้าของอักขระถัดไป เมื่อดีกรีขาเข้าของอักขระถัดไปลดลงถึง 0 ให้เพิ่มอักขระนั้นเข้าคิว รวบรวมอักขระตามลำดับการประมวลผล ซึ่งก็คือลำดับอักษรของภาษาต่างดาว

หากผลลัพธ์มีอักขระครบทั้งหมด แสดงว่าเรามีลำดับที่ถูกต้อง หากมีอักขระน้อยกว่าจำนวนที่คาดไว้ แสดงว่ามีวัฏจักร ข้อจำกัดจึงขัดแย้งกัน และเราจะคืนค่าสตริงว่าง

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)

การจัดการกรณีขอบ: โจทย์ทั้งสอง

ทั้งบันไดคำ II และพจนานุกรมภาษาต่างดาวมีกรณีขอบที่ละเอียดอ่อน ซึ่งจะทำให้ได้คำตอบผิดหากจัดการไม่ถูกต้อง:

  • บันไดคำ II: beginWord และ endWord เหมือนกัน (คืนค่า [[beginWord]] หรือความยาว 1) endWord ไม่อยู่ใน wordList (คืนค่าว่าง) ไม่มีเส้นทาง (คืนค่าว่าง)
  • พจนานุกรมภาษาต่างดาว: คำซ้ำ (ไม่ดึงข้อจำกัด) มีคำเดียว (คืนค่าอักขระที่ไม่ซ้ำทั้งหมด) มีวัฏจักรในข้อจำกัด (คืนค่า '') คำหนึ่งเป็นคำนำหน้าที่มีความยาวมากกว่าของคำถัดไป (ข้อมูลนำเข้าไม่ถูกต้อง ให้คืนค่า '') อักขระทั้งหมดเป็นโหนดโดดเดี่ยว (คืนค่าลำดับใดก็ได้)
# 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()

การวิเคราะห์ความซับซ้อน: โจทย์ทั้งสอง

ความซับซ้อนของบันไดคำ II: ระยะ BFS มีความซับซ้อน O(n × L × 26) เมื่อ n = จำนวนคำในรายการ และ L = ความยาวคำ สำหรับแต่ละคำในแต่ละระดับ BFS เราจะสร้างคำที่เป็นไปได้ 26L คำ และตรวจสอบการมีอยู่ในเซตคำ (ใช้เวลา O(1) ต่อการตรวจสอบ) ระยะ DFS มีความซับซ้อน O(K × L) เมื่อ K = จำนวนเส้นทางที่สั้นที่สุด (ในทางทฤษฎีอาจมีจำนวนเพิ่มขึ้นแบบเอ็กซ์โพเนนเชียล)

ความซับซ้อนของพจนานุกรมภาษาต่างดาว: การสร้างกราฟมีความซับซ้อน O(C) เมื่อ C = จำนวนอักขระทั้งหมดในทุกคำ การเรียงลำดับเชิงทอพอโลยีมีความซับซ้อน O(V + E) เมื่อ V = จำนวนอักขระที่ไม่ซ้ำ และ E = จำนวนข้อจำกัดด้านลำดับ โดยรวมมีความซับซ้อน O(C) หรือเท่ากับ O(จำนวนอักขระทั้งหมดในข้อมูลนำเข้า)

# 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()

สรุปรูปแบบ: แม่แบบที่นำกลับมาใช้ได้สองแบบ

โจทย์ทั้งสองสอนรูปแบบที่นำกลับมาใช้ได้ บันไดคำ II = BFS สำหรับระยะทาง + DFS สำหรับสร้างเส้นทางกลับคืน: รูปแบบนี้ปรากฏเมื่อใดก็ตามที่คุณต้องการเส้นทางที่สั้นที่สุดทั้งหมดในกราฟที่ไม่มีน้ำหนัก ให้สร้างแผนที่บรรพบุรุษระหว่าง BFS แล้วจึงย้อนกลับจากจุดหมายไปยังจุดเริ่มต้น

พจนานุกรมภาษาต่างดาว = การดึงเส้นเชื่อม + การเรียงลำดับเชิงทอพอโลยี: รูปแบบนี้ปรากฏเมื่อคุณได้รับลำดับที่เรียงไว้และต้องอนุมานกฎการจัดลำดับที่อยู่เบื้องหลัง ให้ดึงข้อจำกัดแบบมีทิศทางจากคำแต่ละคู่ที่อยู่ติดกัน แล้วใช้ขั้นตอนวิธีของ Kahn คืนค่า '' เมื่อตรวจพบวัฏจักร (ไม่สามารถจัดลำดับได้)

# 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)

สร้างความมั่นใจในการแก้โจทย์ยาก

โจทย์ยากอาจดูเหมือนเป็นไปไม่ได้ในตอนแรก แต่จะเข้าถึงได้มากขึ้นเมื่อใช้กรอบความคิดที่เหมาะสม แนวคิดสำคัญมีดังนี้:

  • แยกประเด็น: แก้โจทย์ย่อยแต่ละส่วนอย่างอิสระก่อนเชื่อมโยงเข้าด้วยกัน
  • รู้จักองค์ประกอบพื้นฐานของคุณ: BFS/DFS การเรียงลำดับเชิงทอพอโลยี Dijkstra ตาราง DP — โจทย์ยากจะผสมผสานสิ่งเหล่านี้ในรูปแบบที่ไม่ชัดเจน
  • เริ่มจากตัวอย่าง: ไล่แก้โจทย์ด้วยตนเองจากตัวอย่างเล็ก ๆ เพื่อค้นหาโครงสร้างที่อยู่เบื้องหลัง
  • ตรวจสอบโจทย์ย่อย: หลังจากเขียนระยะที่ 1 (การสร้างกราฟ) แล้ว ให้พิมพ์กราฟและตรวจสอบด้วยตนเองก่อนดำเนินการต่อไประยะที่ 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')

ตรวจสอบความเข้าใจอย่างรวดเร็ว

โปรดตรวจสอบความเข้าใจแนวคิดโครงสร้างข้อมูลและอัลกอริทึม — การเตรียมตัวสัมภาษณ์การเขียนโปรแกรมจากบทเรียนนี้

ทบทวนบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า บันไดคำ II ใช้ BFS เพื่อสร้างแผนที่บรรพบุรุษของโหนดก่อนหน้าบนเส้นทางที่สั้นที่สุดทั้งหมด จากนั้นใช้ DFS พร้อมการย้อนกลับเพื่อแจกแจงเส้นทางที่สั้นที่สุดทั้งหมดด้วยการเดินตามบรรพบุรุษจากจุดสิ้นสุดไปยังจุดเริ่มต้น พจนานุกรมภาษาต่างดาวดึงข้อจำกัดแบบมีทิศทางจากคำแต่ละคู่ที่อยู่ติดกัน และใช้การเรียงลำดับเชิงทอพอโลยีของ Kahn เพื่อจัดลำดับอักขระ พร้อมคืนค่าสตริงว่างเมื่อตรวจพบวัฏจักร และ โจทย์ยากสามารถแบ่งออกเป็นโจทย์ย่อยหลายส่วน — การสร้างกราฟ การหาระยะทาง และการสร้างเส้นทางกลับคืน — โดยแต่ละส่วนแก้แยกกันด้วยอัลกอริทึมที่คุ้นเคย ตอนนี้คุณเรียนจบหลักสูตรการเตรียมสัมภาษณ์ DSA ครบถ้วนแล้ว โปรดนำรูปแบบและเทคนิคทั้งหมดจากเส้นทางการเรียนรู้นี้ไปใช้ในการสัมภาษณ์ด้วยความมั่นใจ

คำถามที่พบบ่อย

บทเรียน “การอธิบายปัญหายาก: Word Ladder II และ Alien Dictionary” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การอธิบายปัญหายาก: Word Ladder II และ Alien Dictionary” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส DSA Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส DSA Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การอธิบายปัญหายาก: Word Ladder II และ Alien Dictionary”

ลงมือแก้ปัญหายากสองข้อแบบครบกระบวนการ ได้แก่ word-ladder-II ด้วย BFS + การย้อนกลับ และ alien-dictionary ด้วยการเรียงลำดับเชิงทอพอโลยี พร้อมคำอธิบายอย่างละเอียด คุณปฏิบัติ DSA Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน DSA Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน DSA Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การอธิบายปัญหายาก: Word Ladder II และ Alien Dictionary” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน DSA Interview Prep นี้ได้ไหม

ได้ บทเรียน DSA Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ชีตสรุปการจดจำรูปแบบ
  2. การสัมภาษณ์จำลองจับเวลา: ปัญหาระดับง่ายและปานกลาง
  3. การรับมือกรณีขอบเขตและการสื่อสารของผู้เข้าสัมภาษณ์
  4. การอธิบายปัญหายาก: Word Ladder II และ Alien Dictionary
← กลับไปที่ DSA Interview Prep