返回
实现流畅、准确的搜索——LeetCode 79、单词搜索的算法剖析
后端
2024-01-19 10:25:42
【前言】
算法世界的旅途总是充满探索和挑战,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:单词搜索,是一道考验算法技巧的经典题目,它的解决方案——回溯算法,也成为了算法宝库中一颗璀璨的明珠。通过本文的深入解析,希望您能对回溯算法的原理和应用有一个更加深刻的理解。探索算法的奥妙,永无止境。