剑指Offer 12. 矩阵中的字符串路径 == 79. 单词搜索(M)
-
【剑指Offer 12. 矩阵中的字符串路径】和【79. 单词搜索】是同一题!!!
class Solution:
### 1114 DFS + 回溯法(200 ms,14.9 MB)
def exist(self, board: List[List[str]], word: str) -> bool:
# dfs表示从某行某列开始的一次的递归搜索结果
def dfs(i, j, k):
# 首先检查下标是否越界,或当前字符是否是路径中的当前字符(不满足其中一条则表示本次搜索不可行,返回并开始下一次搜索)
if not 0 <= i < len(board) or not 0 <= j < len(board[0]) or board[i][j] != word[k]: return
# 若路径已匹配完整,则返回True
if k == len(word) - 1: return True
# 开始下轮递归搜索之前,需要先标记已经搜索过的字符(题目要求不能经过重复的字符),这里将其置为空字符串作为标记
board[i][j] = ''
# 开始下一轮递归搜索,只要有一个方向搜索成功,则返回True
res = dfs(i+1, j, k+1) or dfs(i-1, j, k+1) or dfs(i, j+1, k+1) or dfs(i, j-1, k+1)
# 本次(从某行某列开始的)递归搜索结束后,需要将原二维数组还原,以便进行下一次的递归搜索
board[i][j] = word[k]
return res
# 通过遍历的方法(从每行每列开始),来匹配路径
for i in range(len(board)): # 行遍历
for j in range(len(board[0])): # 列遍历
if dfs(i, j, 0): return True # 若有一次匹配成功,则表示存在合法路径
return False # 若遍历完整个矩阵都没有匹配成功,则不存在合法路径,返回False
212. 单词搜索 II
- 官方题解2种
- 解法1:dfs回溯 + 字典树
class Trie:
def __init__(self):
self.children = defaultdict(Trie)
self.word = ""
def insert(self, word):
cur = self
for c in word:
cur = cur.children[c]
cur.is_word = True
cur.word = word
class Solution:
def findWords(self, board: List[List[str]], words: List[str]) -> List[str]:
trie = Trie()
for word in words:
trie.insert(word)
def dfs(now, i1, j1):
if board[i1][j1] not in now.children:
return
ch = board[i1][j1]
now = now.children[ch]
if now.word != "":
ans.add(now.word)
board[i1][j1] = "#"
for i2, j2 in [(i1 + 1, j1), (i1 - 1, j1), (i1, j1 + 1), (i1, j1 - 1)]:
if 0 <= i2 < m and 0 <= j2 < n:
dfs(now, i2, j2)
board[i1][j1] = ch
ans = set()
m, n = len(board), len(board[0])
for i in range(m):
for j in range(n):
dfs(trie, i, j)
return list(ans)
- 方法2