[python]leetcode(79). Word Search

problem

Given a 2D board and a word, find if the word exists in the grid.

The word can be constructed from letters of sequentially adjacent
cell, where “adjacent” cells are those horizontally or vertically
neighboring. The same letter cell may not be used more than once.

For example, Given board =

[ [‘A’,’B’,’C’,’E’],
[‘S’,’F’,’C’,’S’],
[‘A’,’D’,’E’,’E’] ]

word = “ABCCED”, -> returns true,
word = “SEE”, -> returns true,
word = “ABCB”, -> returns false.

solution

题目的意思就是给定一个二维的字符数组和一个字符串,只允许上下左右连接看能否形成给定的字符串(数组中每个字符只能使用一次)。

先考虑只能从某个固定位置起始的组合,如果说没有“数组中每个字符只能使用一次”的限制的话,我们只需要递归的对这个位置的四个方向探索word[1:]即可,加上这个限制后我们每次探索前要把这个位置先修改成非字符元素(如None),但是注意因为是递归算法所以每次修改之后都要改回原来的值。

只要对数组中每个元素都调用上面的函数即可。

class Solution(object):
    def exist(self, board, word):

        def find(board, word, i, j, m, n):
        '''从i,j开始深度优先搜索word是否在board中
        '''
            if word == '':
                return True
            if i < 0 or i >= m or j < 0 or j >= n:
                return False

            elif word[0] == board[i][j]:

                board[i][j] = None #标记
                res = find(board, word[1:], i+1, j, m, n)or find(board, word[1:], i-1, j, m, n)or find(board, word[1:], i, j+1, m, n)or find(board, word[1:], i, j-1, m, n):

                board[i][j] = word[0] #恢复原来的值

                return res



        if len(word) == 0:
            return True

        m = len(board)
        if m == 0:
            return False
        n = len(board[0])

        for i in range(m):
            for j in range(n):
                if find(board, word, i, j, m, n):
                    return True
        else:
            return False

总结

本题考察的主要是对多维数组的深度优先搜索,如果在递归中修改了可变对象的值,在递归函数结束之后要改回来。

ps:在python中如果or运算符左边的值为True则停止往后计算,直接返回True,所以可以利用这个特性做dfs,如果有一个为真则直接返回,不用一个个判断

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值