79 单词搜索
class Solution(object):
#深度搜索
def exist(self, board, word):
self.flag=0
self.len=len(word)
m, n =len(board),len(board[0])
# 找起始位
for i in range(m):
for j in range(n):
if board[i][j]==word[0]:
self.dfs(board,i,j,0)
if self.flag: return True
return False
def dfs(self,board,x,y,index):#k为所查单词的下标位
m,n=len(board),len(board[0])
if self.flag or x < 0 or x >= n or y < 0 or y >= m or board[x][y] == 0 or board[x][y] != word[index]: return
if index==self.len-1:
self.flag=1
return
for i, j in [(x - 1, y), (x, y - 1), (x + 1, y), (x, y + 1)]:
pre=board[x][y]
board[x][y]=0
self.dfs(board, i, j, index+1)
board[x][y]=pre
212 单词搜索II
class Solution(object):
def findWords(self,board,words):
self.END_OF_WORD="#"
if not board or not board[0]:
return []
if not words:return []
self.result=set()
#构建trie树
root=collections.defaultdict()
for word in words:
node=root
for char in word:
node=node.setdefault(char,collections.defaultdict())
node[self.END_OF_WORD]=self.END_OF_WORD
self.m,self.n=len(board),len(board[0])
for i in range(self.m):
for j in range(self.n):
if board[i][j] in root:
self._dfs(board,i,j,"",root)
#将结果转为list
return list(self.result)
def _dfs(self,board,i,j,cur_word,cur_dict):#查询数组,i,j,当前词汇,当前trie树搜寻节点
dx=[0,0,1,-1]
dy=[1,-1,0,0]
cur_word+=board[i][j]
cur_dict=cur_dict[board[i][j]]
#是否为叶子节点
if self.END_OF_WORD in cur_dict:
self.result.add(cur_word)
#查过的位置用@符号标志,并记录之前位置上的值->用于回溯
temp,board[i][j]=board[i][j],"@"
for k in range(4):
x,y=i+dx[k],j+dy[k]
if 0<=x<self.m and 0<=y<self.n \
and board[x][y] !="@" and board[x][y] in cur_dict:
self._dfs(board,x,y,cur_word,cur_dict)
board[i][j]=temp
上述代码解释:
#以下面示例为例:
board = [["o", "a", "a", "n"],
["e", "t", "a", "e"],
["i", "h", "k", "r"],
["i", "f", "l", "v"]]
words = ["oath","pea","eat","rain"]
构建好的trie树为:
root=defaultdict(None,
{
'o': defaultdict(None, {'a': defaultdict(None, {'t': defaultdict(None, {'h': defaultdict(None, {'#': '#'})})})}),
'p': defaultdict(None, {'e': defaultdict(None, {'a': defaultdict(None, {'#': '#'})})}),
'e': defaultdict(None, {'a': defaultdict(None, {'t': defaultdict(None, {'#': '#'})})}),
'r': defaultdict(None, {'a': defaultdict(None, {'i': defaultdict(None, {'n': defaultdict(None, {'#': '#'})})})})
}
)