leetcode解题笔记-word-ladder (python版)

本文详细探讨了解决Word Ladder问题的深度学习与算法优化策略,包括深度遍历与宽度遍历的使用,以及如何通过改进字符串处理方法避免超时错误。重点介绍了在不同情况下选择合适的数据结构和算法的重要性,并通过实例展示了优化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题地址:https://oj.leetcode.com/problems/word-ladder/

提交了多次,基本都是超时错误。记录一下做题的思路。

1、首先这种问题要么用宽度遍历,要么深度遍历。

很不幸,我开始选择了深度遍历,我是想在深度遍历时配合剪枝。无奈超时。

2、后来改用宽度遍历。宽度遍历可以再遍历到最短时,直接返回结果

采用宽度遍历后,依然超时,后来和别人的代码作对比,发现别人在处理的过程中,判断下一步的方法有点特别:

我的方法,直接从dict中找,判断是否和字符串只差一个字符。这种情况,需要比较的次数为len(dict)

3、别人的方法,枚举出所有跟这个字符串相差一个字符的字符串,然后判断是否在dict中,因为dict是set,所以判断是否在dict中不会太慢,这样需要处理的次数为26*len(stri),用了这种方法不会超时,这种方法比较适合字符串较少,而dict很多。所以还是根据测试集来判断用那种方法。

用了别人的方法以后,还是超时,后来发现时我把拆分字符串这个步骤写到循环里了。

修改后的代码如下

class Solution:
    # @param start, a string
    # @param end, a string
    # @param dict, a set of string!!!dict is a set type!!!
    # @return an integer
    def ladderLength(self, start, end, dict):
        dict.add(end)
        path = [(start,1)]
        length = 1
        while path : 
            p = path[0][0]
            l = path[0][1]
            for j in range(0,len(p)):
                tmp1,tmp2 = p[:j:],p[j+1::]
                for c in "abcdefghijklmnopqrstuvwxyz":
                    if c==p[j]:
                        continue
                    tmp = tmp1 +c+ tmp2
                    if tmp in dict:
                        if tmp==end:
                            return l+1
                        dict.remove(tmp)
                        path.append((tmp,l+1))
            path.remove(path[0])
        return 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值