1 # @Author :whyCai 2 # @Time :2021/3/18 21:53 3 4 """ 5 二维网格和一个单词,找出该单词是否存在网格中 6 1.单词必须按照字母顺序,通过相邻的单元格内的字母工程,其中 “相邻”单元格是那些水平或垂直相邻的单元格,同一个单元格内的字母不允许重复使用 7 8 例子: 9 board = 10 [ 11 ['A','B','C','E'], 12 ['S','F','C','S'], 13 ['A','D','E','E'] 14 ] 15 16 word = 'ABCCED' 返回true 17 word = 'SEE' 返回true 18 word = 'ABCB' 返回false 19 20 board和word只包含大小写英文字母 21 board、board[i],word 长度 >=1 22 """ 23 import copy 24 25 class Solution: 26 def wordExist(self, board,word) -> bool: 27 #网格 长、高,单词的长度 28 boardLen = len(board[0]) 29 boardHei = len(board) 30 wordLen = len(word) 31 32 #单词长度比网格还多 33 if wordLen > boardLen * boardHei:return False 34 35 def wordCont(i, j, pos,w): 36 ''' 37 判断网格周围是否存在该单词 38 :param i: 网格 横坐标 39 :param j: 网格纵坐标 40 :param pos: 标识网格,其中的值为'1',代表已使用 41 :param w: 单词的下标 42 :return: 43 ''' 44 # 标识该位置已使用 45 pos[i][j] = '1' 46 #长度相同,单词遍历结束 47 if wordLen ==w:return True 48 49 # 从已找到的网格坐标(i,j)的四周查找下个单词是否存在 50 for a, b in [(1, 0), (0, 1), (-1, 0), (0, -1)]: 51 ia = i + a 52 jb = j + b 53 if ia >= 0 and ia < boardHei and jb >= 0 and jb < boardLen and pos[ia][jb] != '1' and board[ia][jb] == word[w]: 54 if wordCont(ia,jb,pos,w+1) :return True 55 #标识恢复初始原值,重新查询 56 pos=copy.deepcopy(board) 57 pos[i][j] = '1' 58 return False 59 60 #遍历网格,如果第一个单词存在,则进入 wordCont()查询剩余单词 61 for i in range(boardHei): 62 for j in range(boardLen): 63 if board[i][j] == word[0] and wordCont(i,j,copy.deepcopy(board),1): 64 return True 65 return False 66 67 print(Solution().wordExist([['A','B','C','E'],['S','F','C','S'],['A','D','E','E']],'ABCCED'))