LeetCode79-单词搜索

一生波澜壮阔,不屈不挠。用在褚老身上不足为奇,可以说他是中国改革开放以来第一代企业家的代表,人生经历过两次巅峰,也经历过足以让人就此沉沦的低谷,但褚老依然是以一种坚韧不拔的大毅力挺过来了,放在全中国也难找几个人与之匹配。尤其是古稀之年依然能以一腔热血来创业,其实干精神是我辈之楷模!

 

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

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%左右。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习的学习者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值