对于在字母表中搜索单词的问题,这是一个二维空间问题,可以利用深度优先搜索算法和回溯算法来满足探索与退回的执行过程。
给定一个字母表table以及一个单词word,试求在字母表中是否存在此单词,在字母表中可以任意位置为起点,每一步只能水平移动或者垂直移动,也就是只能在上下左右4个方向上移动。如下例子:
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
对于该问题,如果想要在字母表中搜索单词,一定是需要按位进行搜索的,当搜索到了单词中的第一位的时候,再搜索单词的第二位,直到搜索到单词的所有字母为止,代表该字母表中存在此单词,否则如果搜索某一位的时候不存在,则说明不必继续往下深入继续搜索了,这条路径上是不存在这个单词的,需要及时的进行回溯避免造成资源浪费的情况。
如果以实例1为例子进行展现搜索过程,起始位置并在这个字母表中搜索ABFJ
添加图片注释,不超过 140 字(可选)
在位置(0,0)代表要搜索的第一个字母A,因此从此处开始进行深度优先搜索,变了4个方位的之后,找到右侧的B满足所需要搜索的第二个字母,并且以B为起始点继续深入搜索。
添加图片注释,不超过 140 字(可选)
然后以B为起始点在4个方位进行搜索,根据directions中的只是,按照下上右左的顺序去遍历4个方位,首先向下,搜索到F满足第3为,沿着F继续深处搜索,发现军不满足第4为J,因此该条路径是不满足条件的,然后搜索B的右侧F,满足第3位,继续沿着第1行第3列的F深入搜索,尝试寻找第4为J,满足条件并返回true,找到了单词。
使用python实现的代码如下:
class Solution:
def searchword(self, table, word):
def dfs(i,j,n):
if n>=len(word):
return True
tmp=table[i][j]
table[i][j]='None'
for direct in directions:
if i+direct[0]>=0 and i+direct[0]<len_x and j+direct[1]>=0 and j+direct[1]<len_y :
if table[i+direct[0]][j+direct[1]]==word[n]:
if dfs(i+direct[0],j+direct[1],n+1):
table[i][j]=tmp
return True
table[i][j]=tmp
return False
len_x=len(table)
len_y=len(table[0])
directions=[[1,0],[-1,0],[0,1],[0,-1]]
for i in range(len(table)):
for j in range(len(table[0])):
if table[i][j]==word[0]:
if dfs(i,j,1):
return True
return False