单词搜索
可以评到难的程度,和N皇后难度差不多,虽然逻辑简单一点
剪枝1:把board里的cnt一遍,如果要查的word的cnt比board的多,那肯定无解
剪枝2:考虑word的第一个字母出现的多,还是word的最后一个字母出现的多
核心思路:先剪枝
循环体需要三个参数,i,j负责定位,k负责指向目前在查word的第k个字母
i,j 不等于第k个字母False
已经遍历到第k个字母,在结合前面没有返回False,那就说明True
循环体:遍历过的都做标记,和寻找岛屿一样
用xy来找上下左右有没有符合的
if 0<=x<m and 0<=y<n and dfs(x,y,k+1):
如果没找到
恢复现场
return False
最终遍历使用any 因为任何一个点都可以是查询的起点
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
cnt = Counter(c for row in board for c in row)
#剪枝
if cnt<Counter(word):
return False
#剪枝
if cnt[word[-1]]<cnt[word[0]]:
word = word[::-1]
m,n = len(board),len(board[0])
def dfs(i,j,k):
if board[i][j] != word[k]:
return False
if k == len(word)-1:
return True
board[i][j] = ''
for x,y in (i,j-1),(i,j+1),(i+1,j),(i-1,j):
if 0<=x<m and 0<=y<n and dfs(x,y,k+1):
return True
board[i][j] = word[k]
return False
return any(dfs(i,j,0)for i in range(m) for j in range(n))
黑马点评:setnx和redission