題目描述
給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。
單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中「相鄰」單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。
示例:board =
[['a','b','c','e'],
['s','f','c','s'],
['a','d','e','e']
]給定 word = "abcced", 返回 true
給定 word = "see", 返回 true
給定 word = "abcb", 返回 false
解題思路
這道題看懂了題意還是很簡單的,即乙個dfs回溯即可,中間記錄走過的點的座標
class solution(object):
def __init__(self):
self.visit =
def exist(self, board, word):
target = len(word)
m, n = len(board), len(board[0])
flag = false
def dfs(x, y, tempstr):
if len(tempstr) == 0:
return true
if x < 0 or x >= m or y < 0 or y >= n:
return false
if (x, y) in self.visit:
return false
temp = false
if board[x][y] == tempstr[0]:
temp = dfs(x - 1, y, tempstr[1: ]) or dfs(x + 1, y, tempstr[1: ]) or dfs(x, y - 1, tempstr[1: ]) or \
dfs(x, y + 1, tempstr[1: ])
self.visit.pop()
return temp
for i in range(len(board)):
for j in range(len(board[0])): #從每個座標開始遍歷
self.visit.clear() #每次從乙個點開始時,清空已訪問的點
if board[i][j] == word[0]:
flag = dfs(i, j, word)
if flag is true:
return flag
return flag
s = solution()
print(s.exist([["a","b","c","e"],["s","f","e","s"],["a","d","e","e"]], "abceseeefs"))
**中self.visit.pop()這句話很重要,比如對於
[[a, b, c, e],
[s, f, e, s],
[a, d, e, e]]
這裡遍歷(0, 0)時,發現a與字串起點相同,於是可以開始遍歷,當向右移到c處時,比如先走下方的e,根據**的執行過程,e對應(1, 2)應該加入到visit中,可是發現走不通,此時應該釋放這個(1, 2)座標,試想如果沒有釋放,那麼c從座標(0, 3)處的e開始走,根據待匹配結果,還必須經過(1, 2)處的e,如果沒有釋放,程式就會執行不出來,本來返回true的結果返回false。
力扣79 單詞搜尋
給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。示例 board a b c e s f c s a d e e 給定 word abcced 返回 ...
力扣79 單詞搜尋
class solution return false public boolean existhelper char board,boolean used,char word,int idx,int col,int row if used row col true board row col wo...
力扣 79 單詞搜尋
題目 直接看劍指offer第六十五題矩陣中的路徑 給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。示例 board a b c e s f c s a...