LintCode 120. Word Ladder

题目

这里写图片描述

思路

在判断字符距离的时候有坑。
假设单词长度为 L L ,单词个数为n
如果对于每一个单词,遍历list中所有单词,计算距离,时间复杂度为 O(nL) O ( n ∗ L ) ,在LintCode会超时。
对于每一个单词,遍历每一位的所有26个字母,组成新单词,再判断是否在词表中。词表处理成dict,这样时间复杂度为 O(LL) O ( L ∗ L ) ,AC。

代码

import string
class Solution:
    """
    @param: start: a string
    @param: end: a string
    @param: dict: a set of string
    @return: An integer
    """
    def distanceOne(self, word, word_dict):
        res_list = []
        word = list(word)
        for i, v in enumerate(word):
            for c in string.ascii_lowercase:
                if c != v:
                    word[i] = c
                    str_word = ''.join(word)
                    if str_word in word_dict and word_dict[str_word]:
                        res_list.append(str_word)
                    word[i] = v
        return res_list
    def bfs(self, start, end, word_list, word_dict):
        count = 0
        queue = []
        queue.append([start, 1])
        while queue:
            word = queue[0][0]
            distance = queue[0][1]
            queue.pop(0)
            if word == end:
                return distance
            for w in self.distanceOne(word, word_dict):
                queue.append([w, distance + 1])
                word_list.remove(w)
                word_dict[w] = 0
        return 0
    def ladderLength(self, start, end, dict):
        # write your code here
        word_list = list(dict)
        word_dict = {}
        if end not in word_list:
            word_list.append(end)
        for word in word_list:
            word_dict[word] = 1
        return self.bfs(start, end, word_list, word_dict)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值