给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词可以由相邻的单元格(水平或垂直相邻)中的字母组成,同一个单元格中的字母只能使用一次。
答题要点
可以使用回溯算法来解决这个问题。回溯算法是一种深度优先搜索的方法,通过递归地尝试所有可能的路径来找到满足条件的解。具体步骤如下:首先,遍历二维网格,找到与单词第一个字母匹配的单元格。然后,从该单元格开始进行深度优先搜索。在搜索过程中,标记当前单元格为已访问,然后递归地尝试其上下左右四个相邻的单元格,看是否能继续匹配单词的下一个字母。如果匹配成功,继续递归搜索;如果匹配失败,回溯到上一步,撤销当前单元格的标记。以下是实现代码: python def exist(board, word): rows, cols = len(board), len(board[0]) directions = [(0, 1), (0, -1), (1, 0), (-1, 0)] def backtrack(i, j, index): if index == len(word): return True if i < 0 or i >= rows or j < 0 or j >= cols or board[i][j] != word[index]: return False temp = board[i][j] board[i][j] = '#' for dx, dy in directions: if backtrack(i + dx, j + dy, index + 1): return True board[i][j] = temp return False for i in range(rows): for j in range(cols): if backtrack(i, j, 0): return True return False 这种方法的时间复杂度是 O(m * n * 3^L),其中 m 和 n 是网格的行数和列数,L 是单词的长度;空间复杂度是 O(L),主要用于递归调用栈的空间。