返回

实现流畅、准确的搜索——LeetCode 79、单词搜索的算法剖析

后端

【前言】
算法世界的旅途总是充满探索和挑战,LeetCode 79:单词搜索,便是其中一道考验您智慧与创意的烧脑习题。今天,我们就来一起踏上这段算法之旅,步步拆解题目的精髓,领略其内在的玄妙。

【思想引路】
Imagine,您置身于字母方格的迷宫中,任务是搜寻单词的足迹。在方格中滑动手指,连接相邻的字母,犹如探寻隐匿宝藏的线索。LeetCode 79 算法的精髓在于创造性地运用回溯技术,通过深度优先遍历每一个可能的路径,当字母序列与目标单词完美匹配时,您就获得了胜利果实。

【算法细节】
构建解题之路的第一步,是定义一个二维数组 board,它忠实地呈现了字母方格的排列组合。随后,我们准备了一个空字符串 word,它将逐渐装载目标单词的字母。接着,我们进入一个循环,逐个检查数组 board 中的每一个字母。倘若当前字母与 word 的第一个字母相符,那么我们进入回溯函数的内部世界。

在回溯函数中,我们将 `word` 的第一个字母从字符串中移除,并探索当前字母周围八个方向(上、下、左、右、左上、左下、右上、右下)的每一个可能的相邻字母。对于每一个相邻字母,我们首先检查它是否属于目标单词,然后继续递归地探索下一个相邻字母。如果我们最终能够成功匹配目标单词的所有字母,那么我们将找到一个解,并将其加入到解集。

**【代码呈现】** 
```python
def exist(board: List[List[str]], word: str) -> bool:
    rows, cols = len(board), len(board[0])

    def dfs(row, col, word_index):
        if row < 0 or row >= rows or col < 0 or col >= cols or board[row][col] != word[word_index]:
            return False
        if word_index == len(word) - 1:
            return True

        temp, board[row][col] = board[row][col], '/'  # 标记已经访问过的单元格
        found = (
            dfs(row + 1, col, word_index + 1)
            or dfs(row - 1, col, word_index + 1)
            or dfs(row, col + 1, word_index + 1)
            or dfs(row, col - 1, word_index + 1)
        )
        board[row][col] = temp  # 恢复单元格的原始值
        return found

    for i in range(rows):
        for j in range(cols):
            if board[i][j] == word[0] and dfs(i, j, 0):
                return True
    return False
    **【点睛之笔】** 
    算法的灵魂在于回溯。正因回溯,我们才能够沿着每一个可能的路径前行,探索每一个可能的字母组合,直至发现目标单词的踪迹。回溯如同攀登高山,一步一步稳扎稳打,最终抵达峰顶。

**【结语】** 
    LeetCode 79:单词搜索,是一道考验算法技巧的经典题目,它的解决方案——回溯算法,也成为了算法宝库中一颗璀璨的明珠。通过本文的深入解析,希望您能对回溯算法的原理和应用有一个更加深刻的理解。探索算法的奥妙,永无止境。