leetcode79. 单词搜索

在这里插入图片描述
回溯算法

添加备注

class Solution:
    directions = [(-1, 0), (1, 0), (0,-1), (0, 1)]

    def exist(self, board: List[List[str]], word: str) -> bool:
        row = len(board)
        col = len(board[0])
        visited = [[0] * col for _ in range(row)]
        cur_i, cur_j = 0, 0
        for i in range(row):
            for j in range(col):
                if board[i][j] == word[0]:
                    cur_i = i
                    cur_j = j
                    visited[i][j] = 1
                    if self.backtrack(board, word[1:], cur_i, cur_j, visited):
                        return True
                    else:
                        visited[i][j] = 0
        return False

    def backtrack(self, board, word, i, j, visited):
        # 终止条件
        if word == "":
            return True
        # 遍历每个方向 
        for direct in self.directions:
            cur_i = i + direct[0]
            cur_j = j + direct[1]
            # 没越界,且匹配字符
            if cur_i >=0 and cur_i < len(board) and cur_j >= 0 and cur_j < len(board[0]) and board[cur_i][cur_j] == word[0]:
                # 不能重复访问
                if visited[cur_i][cur_j] == 1:
                    continue
                # 标记为已使用
                visited[cur_i][cur_j] = 1
                # 后面的位置也匹配,返回true
                if self.backtrack(board, word[1:], cur_i, cur_j, visited):
                    return True
                else:
                    # 后面不匹配,回溯,上一个位置的其他方向
                    visited[cur_i][cur_j] = 0
        return False
class Solution:
    find = False
    def exist(self, board: List[List[str]], word: str) -> bool:
        row = len(board)
        col = len(board[0])
        visited = [[0] * col for _ in range(row)]
        cur_i, cur_j = 0, 0
        for i in range(row):
            for j in range(col):
                self.dfs(board, word, i, j, visited, 0)
        return self.find

    def dfs(self, board, word, i, j, visited, word_index):
        # print(i, j)
        if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]) or visited[i][j] or board[i][j] != word[word_index]:
            return
        if word_index == len(word) - 1:
            self.find = True
            return
        visited[i][j] = 1
        self.dfs(board, word, i + 1, j, visited, word_index + 1) or self.dfs(board, word, i - 1 , j, visited, word_index + 1) or self.dfs(board, word, i, j - 1, visited, word_index + 1) or self.dfs(board, word, i, j + 1, visited, word_index + 1)
        visited[i][j] = 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值