一生波澜壮阔,不屈不挠。用在褚老身上不足为奇,可以说他是中国改革开放以来第一代企业家的代表,人生经历过两次巅峰,也经历过足以让人就此沉沦的低谷,但褚老依然是以一种坚韧不拔的大毅力挺过来了,放在全中国也难找几个人与之匹配。尤其是古稀之年依然能以一腔热血来创业,其实干精神是我辈之楷模!
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
思路:
首先是根据word字符串的首字符来确定board矩阵内首字符的位置,然后根据查找到的位置分别检索,看看是否有一条路径上的字符组成的字符串与word相同。若存在,则返回true,反之则返回false。那么如何查找这条关键路径呢?答案是回溯法。一般使用回溯法得配套定义一个标记矩阵,用来标记已经走过的点,本题亦是如此。可直接在给定矩阵board上使用,如图所示:
具体的回溯法求解步骤可参考我另一篇文章,讲的很详细了。
https://blog.csdn.net/weixin_36431280/article/details/84891567
代码如下:
class Solution(object):
# 本题采用回溯法
def exist(self, board, word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
# 定义当前点运动轨迹的集合
move_directions = [[-1, 0], [0, 1], [1, 0], [0, -1]]
# 核心递归算法
def back(start_pos, word):
if len(word) == 0:
return True
for direc in move_directions:
next_index = [start_pos[0] + direc[0], start_pos[1] + direc[1]]
if self.check_pos(next_index, board):
if board[next_index[0]][next_index[1]] == word[0]:
tmp = word[0]
board[next_index[0]][next_index[1]] = '*'
if back(next_index, word[1:]):
return True
board[next_index[0]][next_index[1]] = tmp
for row in range(len(board)):
for col in range(len(board[0])):
if board[row][col] == word[0]:
tmp = board[row][col]
board[row][col] = '*'
if back([row, col], word[1:]):
return True
board[row][col] = tmp
return False
# 检查给定位置是否合法
def check_pos(self, pos, board):
if pos[0] in range(len(board)) and pos[1] in range(len(board[0])) and board[pos[0]][pos[1]] != '*':
return True
else:
return False
if __name__ == "__main__":
board = [['A', 'B', 'C', 'E'], ['S', 'F', 'C', 'S'], ['A', 'D', 'E', 'E']]
word = "ABCCED"
is_match = Solution().exist(board, word)
print(is_match)
不过执行效率较差,只有10%左右。