Python刷leetcode--剑指 Offer 12.矩阵中的路径

  • python for遍历怎么带下标。enumerate 内置函数
  • 递归的大体思路。找到一个然后,深入。不能进入格子两次 这种条件可以通过在当前层改变当前值的方式来避免重入
  • 递归的出口。如果四个有任何一个满足就深入,深入 [深入的结果是一个bool值],如果长度相等返回true,因为上一层递归 l+1 了,,这个有点难理解。l表示走过的长度生成的字符串是不是已经相等了
  • 回溯法,本层做完操作了 要还原,不能影响其他层
from typing import List

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        # leetcode submit region end(Prohibit modification and deletion)
        for i, vi in enumerate(board):
            for j, vj in enumerate(vi):
                if vj == word[0]:
                    if self._dfs(board, word, i, j, 0):
                        return True
        return False

    # 怎么判断不能走过走过的路,把他赋空
    def _dfs(self, board, word, i, j, l):
        if l == len(word):
            return True
        if i < 0 or j < 0 or i == len(board) or j == len(board[0]):
            return False
        if board[i][j] == word[l]:
            tmp = board[i][j]
            board[i][j] = ''

            if self._dfs(
                    board, word, i + 1, j, l + 1) or self._dfs(
                board, word, i - 1, j, l + 1) or self._dfs(
                board, word, i, j + 1, l + 1) or self._dfs(
                board, word, i, j - 1, l + 1):
                return True
            else:
                board[i][j] = tmp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值