发布于2020-02-28 12:29 阅读(1135) 评论(0) 点赞(10) 收藏(3)
题解:
本题是一个遍历搜索问题,我们可以用回溯算法进行求解。
class Solution:
def exist(self, board, word):
#设置数组中的元素只能被使用一次
used = [[False] * len(board[0]) for i in range(len(board))]
# print(used)
for i in range(len(board)):
for j in range(len(board[0])):
if(self.dfs_search(board, i, j,word,0,len(word) - 1)):
return True
return False
def dfs_search(self, board, x, y, word,index,length_word):
if board[x][y] != word[0]:
return False
#递归终止条件
if index == length_word:
return True
#四个方向进行遍历
# print(x,y)
# print(word[0])
# print('index,',index)
# print('word',len(word) - 1)
# if board[x][y] == word[0]:
# used[x][y] = True
tmp = board[x][y]
board[x][y] = 0
#向下遍历
if (x < len(board) - 1 and self.dfs_search(board, x + 1, y, word[1:],index + 1,length_word)) or \
(y < len(board[0]) - 1 and self.dfs_search(board, x, y + 1, word[1:],index + 1,length_word)) or \
(x > 0 and self.dfs_search(board, x - 1, y, word[1:], index + 1,length_word)) or \
(y > 0 and self.dfs_search(board, x, y - 1, word[1:], index + 1,length_word)):
return True
board[x][y] = tmp
return False
完整的代码:
class Solution:
def exist(self, board, word):
#设置数组中的元素只能被使用一次
used = [[False] * len(board[0]) for i in range(len(board))]
# print(used)
for i in range(len(board)):
for j in range(len(board[0])):
if(self.dfs_search(board, i, j,word,0,len(word) - 1)):
return True
return False
def dfs_search(self, board, x, y, word,index,length_word):
if board[x][y] != word[0]:
return False
#递归终止条件
if index == length_word:
return True
#四个方向进行遍历
# print(x,y)
# print(word[0])
# print('index,',index)
# print('word',len(word) - 1)
# if board[x][y] == word[0]:
# used[x][y] = True
tmp = board[x][y]
board[x][y] = 0
#向下遍历
if (x < len(board) - 1 and self.dfs_search(board, x + 1, y, word[1:],index + 1,length_word)) or \
(y < len(board[0]) - 1 and self.dfs_search(board, x, y + 1, word[1:],index + 1,length_word)) or \
(x > 0 and self.dfs_search(board, x - 1, y, word[1:], index + 1,length_word)) or \
(y > 0 and self.dfs_search(board, x, y - 1, word[1:], index + 1,length_word)):
return True
board[x][y] = tmp
return False
另外记录一下本题的AC过程:
首先采用的是比较容易想到的方法,设置了和board一样大小的数组,来记录每个单元格是否被访问;时间复杂度较高,但是容易理解:
class Solution:
def exist(self, board, word):
#设置数组中的元素只能被使用一次
used = [[False] * len(board[0]) for i in range(len(board))]
# print(used)
for i in range(len(board)):
for j in range(len(board[0])):
if(self.dfs_search(board, i, j,word,0,len(word) - 1,[[False] * len(board[0]) for i in range(len(board))])):
return True
return False
def dfs_search(self, board, x, y, word,index,length_word,used):
#递归终止条件
if index == length_word and board[x][y] == word[0]:
return True
#四个方向进行遍历
# print(x,y)
# print(word[0])
# print('index,',index)
# print('word',len(word) - 1)
if board[x][y] == word[0]:
used[x][y] = True
#向下遍历
if x < len(board) - 1:
if used[x + 1][y] == False:
if(self.dfs_search(board, x + 1, y, word[1:],index + 1,length_word,used)):
return True
# else:
# #回溯过程中设置未访问
# used[x][y] = False
#向右遍历
if y < len(board[0]) - 1:
# print("###")
# print(x,y+1)
if used[x][y + 1] == False:
if(self.dfs_search(board, x, y + 1, word[1:],index + 1,length_word,used)):
return True
# else:
# used[x][y] = False
#向上遍历
if x > 0:
if used[x - 1][y] == False:
if(self.dfs_search(board, x - 1, y, word[1:], index + 1,length_word,used)):
return True
# else:
# used[x][y] = False
#向左遍历
if y > 0:
if used[x][y - 1] == False:
if(self.dfs_search(board, x, y - 1, word[1:], index + 1,length_word,used)):
return True
# else:
# used[x][y] = False
used[x][y] = False
return False
else:
return False
之后看了题解,对自己的方法进行了优化,去掉了used数组;
代码如下:
class Solution:
def exist(self, board, word):
#设置数组中的元素只能被使用一次
used = [[False] * len(board[0]) for i in range(len(board))]
# print(used)
for i in range(len(board)):
for j in range(len(board[0])):
if(self.dfs_search(board, i, j,word,0,len(word) - 1)):
return True
return False
def dfs_search(self, board, x, y, word,index,length_word):
if board[x][y] != word[0]:
return False
#递归终止条件
if index == length_word:
return True
#四个方向进行遍历
# print(x,y)
#print(word[0])
#print('index,',index)
#print('word',len(word) - 1)
# if board[x][y] == word[0]:
# used[x][y] = True
tmp = board[x][y]
board[x][y] = 0
#向下遍历
if x < len(board) - 1:
# if used[x + 1][y] == False:
if(self.dfs_search(board, x + 1, y, word[1:],index + 1,length_word)):
return True
# else:
# #回溯过程中设置未访问
# used[x][y] = False
#向右遍历
if y < len(board[0]) - 1:
# print("###")
# print(x,y+1)
# if used[x][y + 1] == False:
if(self.dfs_search(board, x, y + 1, word[1:],index + 1,length_word)):
return True
# else:
# used[x][y] = False
#向上遍历
if x > 0:
# if used[x - 1][y] == False:
if(self.dfs_search(board, x - 1, y, word[1:], index + 1,length_word)):
return True
# else:
# used[x][y] = False
#向左遍历
if y > 0:
# if used[x][y - 1] == False:
if(self.dfs_search(board, x, y - 1, word[1:], index + 1,length_word)):
return True
# else:
# used[x][y] = False
board[x][y] = tmp
return False
后面把4个if合成一个,就是最开始的第一个代码,所需时间最少的。
作者:343ueru
链接:https://www.pythonheidong.com/blog/article/235895/b79f94f63f741e342303/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!