Given a 2D board and a list of words from the dictionary, find all words in the board.
Each word must be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once in a word.
Example:
Input: board = [ ['o','a','a','n'], ['e','t','a','e'], ['i','h','k','r'], ['i','f','l','v'] ] words =["oath","pea","eat","rain"]
Output:["eat","oath"]
Note:
- All inputs are consist of lowercase letters
a-z
. - The values of
words
are distinct.
题目求2D字符表中出现的所有words中的单词。
思路还是比较简单的,做了一个words的查询树,然后DFS遍历2D字符表。代码如下:
class Solution(object):
def __init__(self):
self.wordMap = {
}
self.result = []
self.rowSize = 0
self.colSize = 0
def initWordMap(self,words):
for word in words:
tmpMap = self.wordMap
for c in word:
if c not in tmpMap:
tmpMap[c] = {}
tmpMap = tmpMap[c]
tmpMap[0] = word # tmpMap[0]标记为这条路径是一个单词
def find(self,i,j,board,wordMap):
c = board[i][j]
if c not in wordMap:
return
nextWordMap = wordMap[c]
if 0 in nextWordMap:
self.result.append(nextWordMap[0])
nextWordMap.pop(0)
board[i][j] = 0
if i > 0 and board[i-1][j]:
self.find(i-1,j,board,nextWordMap)
if i < self.rowSize-1 and board[i+1][j]:
self.find(i+1,j,board,nextWordMap)
if j > 0 and board[i][j-1]:
self.find(i,j-1,board,nextWordMap)
if j < self.colSize-1 and board[i][j+1]:
self.find(i,j+1,board,nextWordMap)
board[i][j] = c
if len(nextWordMap) == 0:
wordMap.pop(c)
def findWords(self, board, words):
"""
:type board: List[List[str]]
:type words: List[str]
:rtype: List[str]
"""
rowSize = len(board)
if rowSize == 0:
return []
colSize = len(board[0])
self.rowSize = rowSize
self.colSize = colSize
self.initWordMap(words)
for i in range(rowSize):
for j in range(colSize):
self.find(i,j,board,self.wordMap)
return self.result