解题思路:Trie+dfs,先将word存入trie,然后dfs遍历board,如果前缀不在word则退出,如果是word,且ans中没有,则加入ans。注:trie实现时需用map,否则tle
class TrieNode:
# Initialize your data structure here.
def __init__(self):
self.children = dict()
self.isWord = False
class Trie:
def __init__(self):
self.root = TrieNode()
def insert(self, word):
node = self.root
for letter in word:
child = node.children.get(letter)
if child is None:
child = TrieNode()
node.children[letter] = child
node = child
node.isWord = True
def search(self, word):
node = self.root
for letter in word:
node = node.children.get(letter)
if node is None:
return False
return node.isWord
def startsWith(self, prefix):
node = self.root
for letter in prefix:
node = node.children.get(letter)
if node is None:
return False
return True
class Solution(object):
def findWords(self, board, words):
"""
:type board: List[List[str]]
:type words: List[str]
:rtype: List[str]
"""
m = len(board)
n = len(board[0])
trie = Trie()
for w in words:
trie.insert(w)
ans = []
for i in range(m):
for j in range(n):
tmp = [[0 for q in range(n)] for q in range(m)]
str = board[i][j]
self.findWord(i,j,trie,board,tmp,str,ans)
return ans
def findWord(self,i,j,trie,board,tmp,str,ans):
m = len(board)
n = len(board[0])
tmp[i][j] = 1
if trie.startsWith(str) == False:
tmp[i][j] = 0
return
if trie.search(str) and str not in ans:
ans.append(str)
if i>0 and tmp[i-1][j] == 0:
self.findWord(i-1,j,trie,board,tmp,str+board[i-1][j],ans)
if j>0 and tmp[i][j-1] == 0:
self.findWord(i,j-1,trie,board,tmp,str+board[i][j-1],ans)
if i<m-1 and tmp[i+1][j] == 0:
self.findWord(i+1,j,trie,board,tmp,str+board[i+1][j],ans)
if j<n-1 and tmp[i][j+1] == 0:
self.findWord(i,j+1,trie,board,tmp,str+board[i][j+1],ans)
tmp[i][j] = 0