leetcode -- Word Ladder I & II -- II没有理解

Word Ladder

https://leetcode.com/problems/word-ladder/

这里思路就是BFS, DFS 太慢。对于start word,其可能的下一个word应该是两个for循环,外层是对start word的每个将要替换的字母index的循环,内层是循环25个字母(排除掉当前字母),然后再看是否在wordList里面,如果在的话,就是BFS下一层的candidate,因为是求最短的路径,所以如果对于start word有两个或者以上的candidates,这些candidates记为 set K,那么再下一层的搜索范围只可能在wordList - K的这些word中。例如,K = {w1, w2}, 如果w1再下一层还可以搜索到w2,那么就跟直接从start word到w2的搜索结果一样,但是长度要多1.所以,其实只要在每次循环到word在wordlist中的话,就可以入queue,然后在wordlist中删除这个word。

思路参考http://www.cnblogs.com/zuoyuan/p/3765858.html
http://yucoding.blogspot.hk/2013/08/leetcode-question-127-word-ladder.html
http://liangju.li/post/leetcode/2014-07-03
http://chaoren.is-programmer.com/posts/43039.html

    def ladderLength(self, start, end, dict):
        dict.add(end)
        q = []
        q.append((start, 1))
        while q:
            curr = q.pop(0)
            currword = curr[0]; currlen = curr[1]
            if currword == end: return currlen
            for i in range(len(start)):
                part1 = currword[:i]; part2 = currword[i+1:]
                for j in 'abcdefghijklmnopqrstuvwxyz':
                    if currword[i] != j:
                        nextword = part1 + j + part2
                        if nextword in dict:
                            q.append((nextword, currlen+1)); 
                            dict.remove(nextword)
        return 0

Word Ladder II

https://leetcode.com/problems/word-ladder-ii/

很难,leetcode通过率最低的题目。

参考http://chaoren.is-programmer.com/posts/43039.html

其中 level表示的是BFS 第i层待搜索的nodes or candidates,其实就是queue的一段。然后next_level就是下一层的nodes or candidates. next_level 还记录了这一层每个node的父节点。然后记录到了parents中。
parents保存了所有path的信息,每个node的父节点。

# 2015-06-18  Runtime: 712 ms
class Solution:
    # @param start, a string
    # @param end, a string
    # @param dict, a set of string
    # @return a list of lists of string
    def findLadders(self, start, end, dic):
        # thanks to https://leetcode.com/discuss/24191/defaultdict-for-traceback-and-easy-writing-lines-python-code
        dic.add(end)
        level = set([start])#这里是把一个list转换为set
        # key is word, value is parent word, e.g. {'hot': set(['hit']), 'cog': set(['log', 'dog'])}
        # In each level, defaultdict(set) can remove duplicates, first we need to get parent dictionary
        parents = collections.defaultdict(set)
        while level and end not in parents:
            next_level = collections.defaultdict(set)
            for word in level:
                for char in 'abcdefghijklmnopqrstuvwxyz':
                    for i in xrange(len(start)):
                        childWord = word[:i] + char + word[i+1:]
                        if childWord in dic and childWord not in parents: next_level[childWord].add(word)
            level = next_level
            parents.update(next_level)

        # then according parent dictionary, build result from end word to start word
        res = [[end]]
        while res and res[0][0] != start:
            res = [[p] + r for r in res for p in parents[r[0]]]
        return res

没完全理解。

参考:http://yucoding.blogspot.hk/2014/01/leetcode-question-word-ladder-ii.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值