题目描述:给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board = [ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E'] ] 给定 word = "ABCCED", 返回 true. 给定 word = "SEE", 返回 true. 给定 word = "ABCB", 返回 false.
解法1。找字符串不一定要从头开始,所以设置一个双重嵌套for循环保证可以从任一个位置开始索引,设置一个等大小的矩阵存储标志位,在helper函数中首先设置好return False和True的条件,然后递归判断上下左右4个位置是否满足,递归返回上一层后记得把visited复位变成没有访问过。
别的做法思路相当,但事先判断更全面一些,比如增加判断word长度是否小于等于m*n,word里的字符board是否都有。
class Solution(object):
def exist(self, board, word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
if not board or not word:
return False
m = len(board)
n = len(board[0])
visited = [[0 for _ in range(n)] for _ in range(m)]
for i in range(m):
for j in range(n):
if self.helper(board, word, m, n, i, j, 0, visited):
return True
return False
def helper(self, board, word, m, n, i, j, k, visited):
if i<0 or i>=m or j<0 or j>=n or board[i][j] != word[k] or visited[i][j] == 1:
return False
if k == len(word)-1:
return True
visited[i][j] = 1
if self.helper(board,word, m, n, i-1,j,k+1,visited) or \
self.helper(board,word, m, n, i,j-1,k+1,visited) or \
self.helper(board,word, m, n, i+1,j,k+1,visited) or \
self.helper(board,word, m, n, i,j+1,k+1,visited):
return True
visited[i][j] = 0
return