找字母python

 难度指数:⭐⭐⭐⭐⭐

知识点:广度优先搜索

【华为OD机试真题2023B卷 JAVA&JS】找单词

算法参考:

单词搜索-力扣79

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        def dfs(i, j, k):
            if not 0 <= i < len(board) or not 0 <= j < len(board[0]) or board[i][j] != word[k]: return False
            if k == len(word) - 1: return True
            board[i][j] = ''
            res = dfs(i + 1, j, k + 1) or dfs(i - 1, j, k + 1) or dfs(i, j + 1, k + 1) or dfs(i, j - 1, k + 1)
            board[i][j] = word[k]
            return res

        for i in range(len(board)):
            for j in range(len(board[0])):
                if dfs(i, j, 0): return True
        return False

作者:Krahets
链接:https://leetcode.cn/problems/word-search/solutions/2361646/79-dan-ci-sou-suo-hui-su-qing-xi-tu-jie-5yui2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Mine:

idea

回溯是精髓。从单词的第一个字母开始寻找,而对该字母的寻找依赖于其后一位字母的有效性,以此类推,即其后所有字母的有效性,直至最后一个字母。若找到了最后一个字母,就找到了该单词。

代码实现

m=int(input())
mat=[list(input().split(',')) for i in range(m)]
words=input()
n=len(mat[0])
ps=[-1 for i in range(2*len(words))]

def dfs(i,j,k):
    try:
        if mat[i][j]!=words[k]: return False
    except:
        return False
    ps[2*k],ps[2*k+1]=i,j
    if k==len(words)-1: 
        return True
    res=dfs(i-1,j,k+1) or dfs(i+1,j,k+1) or dfs(i,j-1,k+1) or dfs(i,j+1,k+1)
    return res
flag=1
for i in range(m):
    for j in range(n):
        if dfs(i,j,0):
            print(','.join(map(lambda x:str(x),ps)))
            flag=0
            break

if flag:
    print('N') 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值