来自北大算法课的Leetcode题解:1138. 字母板上的路径

文章介绍了如何使用广度优先搜索(BFS)解决从给定的字母板中找到目标字符串的最短路径问题。初始的深度优先搜索(DFS)方案会超时,通过改用BFS并利用字母表顺序进行优化,可以提高效率。代码示例展示了Python类`Solution`的方法,该方法通过BFS找到目标字母并记录路径。

代码仓库Github | Leetcode solutions @doubleZ0108 from Peking University.

  • 解法1(超时 51/61):深搜
  • 解法2(T6% S46%):广搜。这道题可以看做有一重循环的路径搜索问题,依次从上一个字母位置到下一个字母位置,但注意我们只需要找到一条最近的路径,而不需要找到所有路,所以解法1的深搜肯定会超时的,改为队列维护的广搜就好啦。内层的广搜跟普通的BFS区别在于,除了要保存位置信息还要保存上一步是怎么走的,也就是UDLR信息,同时Z字母的位置也比较特殊这也是之前BFS没见过的特例。总体而言本题是比较经典的搜索问题不过变种变的还是蛮有趣的
    • 改进:由于字母表是有序的,因此很多搜索都是没必要的,比如要寻找的字母比当前所在位置字母更大,那肯定只有向下找,还有字母间存在一些数字关系,比如两个字母的差是5那他们一定是上下邻居关系,这些字母表的特殊性质作为条件可以加速
class Solution:
    def alphabetBoardPath(self, target: str) -> str:
        board = ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"]

        res = ""
        i, j = 0, 0
        for to in target:
            visited = set()
            queue = [(i, j, "")]
            while queue:
                x, y, parts = queue.pop(0)
                if board[x][y] == to:
                    res += parts + "!"
                    i, j = x, y
                    break
                visited.add(board[x][y])
                
                for dx, dy in [(x+1,y), (x-1,y), (x,y-1), (x,y+1)]:
                    if dx<0 or dy<0 or dx>5 or dy>4:
                        continue
                    if dx==5 and dy!=0:
                        continue
                    if board[dx][dy] in visited:
                        continue
                    if dx == x+1:
                        queue.append((dx, dy, parts+"D"))
                    if dx == x-1:
                        queue.append((dx, dy, parts+"U"))
                    if dy == y+1:
                        queue.append((dx, dy, parts+"R"))
                    if dy == y-1:
                        queue.append((dx, dy, parts+"L"))
        return res
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

doubleZ0108

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

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

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

打赏作者

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

抵扣说明:

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

余额充值