力扣—— 79/212. 单词搜索

79 单词搜索

在这里插入图片描述

class Solution(object):
    #深度搜索
    def exist(self, board, word):
        self.flag=0
        self.len=len(word)

        m, n =len(board),len(board[0])
        # 找起始位
        for i in range(m):
            for j in range(n):
                if board[i][j]==word[0]:
                    self.dfs(board,i,j,0)
                    if self.flag: return True
        return False

    def dfs(self,board,x,y,index):#k为所查单词的下标位
        m,n=len(board),len(board[0])
        if self.flag or x < 0 or x >= n or y < 0 or y >= m or board[x][y] == 0 or board[x][y] != word[index]: return
        if index==self.len-1:
            self.flag=1
            return
        for i, j in [(x - 1, y), (x, y - 1), (x + 1, y), (x, y + 1)]:
                pre=board[x][y]
                board[x][y]=0
                self.dfs(board, i, j, index+1)
                board[x][y]=pre

212 单词搜索II

在这里插入图片描述

class Solution(object):
    def findWords(self,board,words):
        self.END_OF_WORD="#"
        if not board or not board[0]:
            return []
        if not words:return []

        self.result=set()

        #构建trie树
        root=collections.defaultdict()
        for word in words:
            node=root
            for char in word:
                node=node.setdefault(char,collections.defaultdict())
            node[self.END_OF_WORD]=self.END_OF_WORD

        self.m,self.n=len(board),len(board[0])

        for i in range(self.m):
            for j in range(self.n):
                if board[i][j] in root:
                    self._dfs(board,i,j,"",root)
        #将结果转为list
        return list(self.result)

    def _dfs(self,board,i,j,cur_word,cur_dict):#查询数组,i,j,当前词汇,当前trie树搜寻节点
        dx=[0,0,1,-1]
        dy=[1,-1,0,0]
        cur_word+=board[i][j]
        cur_dict=cur_dict[board[i][j]]
        #是否为叶子节点
        if self.END_OF_WORD in cur_dict:
            self.result.add(cur_word)
        #查过的位置用@符号标志,并记录之前位置上的值->用于回溯
        temp,board[i][j]=board[i][j],"@"
        for k in range(4):
            x,y=i+dx[k],j+dy[k]
            if 0<=x<self.m and 0<=y<self.n \
                and board[x][y] !="@" and board[x][y] in cur_dict:
                self._dfs(board,x,y,cur_word,cur_dict)
        board[i][j]=temp

上述代码解释:

#以下面示例为例:
board = [["o", "a", "a", "n"], 
		["e", "t", "a", "e"], 
		["i", "h", "k", "r"], 
		["i", "f", "l", "v"]]   
words = ["oath","pea","eat","rain"]

构建好的trie树为:

root=defaultdict(None,
   {
       'o': defaultdict(None, {'a': defaultdict(None, {'t': defaultdict(None, {'h': defaultdict(None, {'#': '#'})})})}),
       'p': defaultdict(None, {'e': defaultdict(None, {'a': defaultdict(None, {'#': '#'})})}),
       'e': defaultdict(None, {'a': defaultdict(None, {'t': defaultdict(None, {'#': '#'})})}),
       'r': defaultdict(None, {'a': defaultdict(None, {'i': defaultdict(None, {'n': defaultdict(None, {'#': '#'})})})})
   }
)

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小屋*

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

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

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

打赏作者

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

抵扣说明:

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

余额充值