【小YC的Leetcode日记】#79 单词搜索 Word Search

https://leetcode.com/problems/word-search/

2020/08/16

一题经典的宽搜,没有什么难点。用二维vis数组防止回头,退出的时候要记得把那个格子的vis重新设成0。

我的源代码search函数里面return的True和False是没必要的,但是懒得改了。

如果需要输出路径的话,可以用global变量记录路径,也可以对search函数多加母i,j的变量(这样用的内存少一些)。

 

class Solution:
    board = [[]]
    word = ''
    m = 0
    n = 0
    flag = False
    
    def exist(self, board: List[List[str]], word: str) -> bool:
        if len(word) == 0:
            return False
        self.board = board
        self.word = word
        self.m = len(board)
        self.n = len(board[0])
        self.flag = False
        for i in range(self.m):
            for j in range(self.n):
                if self.board[i][j] == self.word[0]:
                    self.flag = False
                    vis = [[0 for p in range(self.n)] for q in range(self.m)]
                    self.search(i, j, 0, vis)
                    if self.flag == True:
                        return True
        return False
    
    def search(self, i, j, ltr, vis):
        if self.flag == True:
            return True
        vis[i][j] = 1

        if ltr == len(self.word) - 1:
            if self.word[ltr] == self.board[i][j]:
                self.flag = True
                return True
            return False
        if self.word[ltr] != self.board[i][j]:
            return False
        nxt = []
        for (di, dj) in [(-1,0),(1,0),(0,1),(0,-1)]:
            if di == 0 and dj == 0:
                continue
            if self.judge(i+di, j+dj, self.word[ltr+1]) and vis[i+di][j+dj] == 0:
                nxt.append((i+di, j+dj))
        for t in nxt:
            (newi, newj) = t
            self.search(newi, newj, ltr+1, vis)
            vis[newi][newj] = 0

    def judge(self, i, j, x):
        if i < 0 or i > self.m - 1 or j < 0 or j >self.n - 1:
            return False
        if self.board[i][j] == x:
            return True
        return False

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值