单词搜索

50 阅读2分钟

给定一个mxn二维字符网格board和一个字符串单词word。如果word存在于网格中,返回true;否则,返回false
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例一:
image.png

输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "ABCCED" 输出:true
示例二:

image.png
输入:board =[['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "SEE"
输出:true

寻找起始位置:能够保证遍历所有的情况,如果直接在递归函数里很困难;
或连接:遍历所有方向,如果有一个方向的路径成立,则成立;
回溯:还原访问状态,三个方向都访问完了,才还原状态。

递归结束条件:

  • 找到路径;
  • 下标越界;
  • 当前值与字符串值相同;
  • 当前位置已访问。
class Solution(object):
    def exist(self, board, word):
        """
        :type board: List[List[str]]
        :type word: str
        :rtype: bool
        """
        r = len(board)
        c = len(board[0])
        m = len(word)
        self.flag = False
        l = list()
        for i in range(r):
            for j in range(c):
                if board[i][j] == word[0]:
                    l.append([i,j])

        def dfs(cur_r,cur_c,cur_w):
            if self.flag:
                return
            if cur_w == m:
                self.flag = True
                return

            if cur_r >= r or cur_c >= c or cur_r < 0 or cur_c < 0:
                return

            if board[cur_r][cur_c] != word[cur_w] or visit[cur_r][cur_c] == 1:
                return

            if board[cur_r][cur_c] == word[cur_w]:
                visit[cur_r][cur_c] = 1
                #相当于或连接,遍历每个方向
                dfs(cur_r+1,cur_c,cur_w+1)
                dfs(cur_r,cur_c+1,cur_w+1)
                dfs(cur_r-1,cur_c,cur_w+1)
                dfs(cur_r,cur_c-1,cur_w+1)
                #中途某个位置走不通,退回
                visit[cur_r][cur_c] = 0

        #找初始位置

        for addression in l:
            visit = [[0]*c for _ in range(r)]
            if self.flag==True:
                break
            dfs(addression[0],addression[1],0)
        return self.flag