问题
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true
思路
考虑用深度优先搜索DFS
递归终止条件:坐标超出边界值或者当前值与所求字符串值不符合或者当前坐标已经访问过
对于已经搜索过的坐标,如果想不重复,可以将其修改为特殊符号,使之与字符串无法匹配
递归方式:对当前坐标向左向右向上向下进行搜索
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
if not word:
return True
res = []
path = ""
visited = set()
def dfs(i,j,k):
if i> len(board)-1 or j>len(board[0])-1 or i<0 or j<0 or word[k]!=board[i][j]:
return False
if k==len(word)-1: return True
visited.add((i,j))
k+=1
tmp , board[i][j] = board[i][j],'/'
res = dfs(i,j+1,k) or dfs(i,j-1,k) or dfs(i-1,j,k) or dfs(i+1,j,k)
board[i][j] = tmp
return res
for i in range(len(board)):
for j in range(len(board[0])):
if dfs(i,j,0):
return True
return False
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
if not word:
return True
visited = [ [0]*len(board[0]) for _ in range(len(board))]
def helper(i,j,visited,word):
if not word:
return True
res = False
if i>=0 and i<len(board) and j>=0 and j<len(board[0]) and board[i][j]==word[0] and visited[i][j]==0:
visited[i][j]=1
res = helper(i+1,j,visited,word[1:]) or helper(i-1,j,visited,word[1:]) or helper(i,j+1,visited,word[1:]) or helper(i,j-1,visited,word[1:])
if not res:
visited[i][j]=0
return res
for i in range(len(board)):
for j in range(len(board[0])):
if helper(i,j,visited,word):
return True
return False