原题地址: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