行列内にある文字列のすべての文字を含むパスがあるかどうかを判断する関数を設計してください。パスはマトリックス内の任意のグリッドから開始でき、各ステップで1つのグリッドをマトリックス内の左、右、上、下に移動できます。パスがマトリックスのグリッドを通過する場合、パスはグリッドに再び入ることができません。たとえば、次の3×4マトリックスには、文字列「bfce」のパスが含まれています(パス内の文字は太字でマークされています)。
[["a"、 "b"、 "c"、 "e"]、
["s"、 "f"、 "c"、 "s"]、
["a"、 "d"、 "e"、 "e"]]
ただし、マトリックスには文字列「abfb」のパスが含まれていません。これは、ストリングの最初の文字bがマトリックスの最初の行の2番目のグリッドを占めた後、パスがこのグリッドに再び入ることができないためです。
例1:
输入:board = [["A"、 "B"、 "C"、 "E"]、["S"、 "F"、 "C"、 "S"]、["A"、 "D"、 "E"、 "E"]]、word = "ABCCED"
输出:true
例2:
输入:board = [["a"、 "b"]、["c"、 "d"]]、word = "abcd"
输出:false
ヒント:
1 <= board.length <= 200
1 <= board [i] .length <= 200
注:この質問はメインステーション79の質問と同じです:https : //leetcode-cn.com/problems/word-search/
出典:LeetCode(LeetCode)
リンク:https ://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof
著作権は控除ネットワークに属しています。商用転載の正式な許可書に連絡し、非商用転載の出典を明記してください。
アイデア:ディープサーチ(dfs)
最初に配列を走査し、各点を始点として試し、次に始点のすべての方向から検索を開始して、パスが見つかるかどうかを確認します。
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
if board == [] or board == [[]]:
return False
# 标记该点是否在本次路径中搜索过
self.visit = [[0]*len(board[0]) for _ in range(len(board))]
# 每个点的周边点,分别为x,y的变化值
self.dx = [0, 0, 0, 1, -1]
self.dy = [0, 1, -1, 0, 0]
self.board = board
self.word = word
for i in range(len(board)):
for j in range(len(board[0])):
rt = self.dfs(i, j, 0)
if rt == True:
return True
return False
def dfs(self, x, y, cnt):
if cnt == len(self.word):
return True
for i in range(len(self.dx)):
xx = x + self.dx[i]
yy = y + self.dy[i]
if xx >= 0 and xx < len(self.board) and yy >= 0 and yy < len(self.board[0]) and self.visit[xx][yy] == 0:
if self.board[xx][yy] == self.word[cnt]:
self.visit[xx][yy] = 1
# print(xx, yy)
rt = self.dfs(xx, yy, cnt+1)
if rt == True:
return True
self.visit[xx][yy] = 0
return False