字梯问题

字梯问题

在字梯中你通过改变一个字母逐渐发生变化。 在每一步,你必须将一个字变换成另一个字。
下面的单词序列示出了对上述问题的一种可能的解决方案:

FOOL
POOL
POLL
POLE
PALE
SALE
SAGE

用图算法解决这个问题的步骤可以描述为:

  • 将字之间的关系表示为图。
  • 使用称为广度优先搜索的图算法来找到从起始字到结束字的有效路径。

构建字梯图

将大量的单词集合转换为图,如果两个词只有一个字母不同,我们就创建从一个词到另一个词的边。下图展示了一些解决 FOOL 到 SAGE 字梯问题的单词的小图。 请注意,图是无向图,边未加权。

解决这个问题的一个想法是:
假设我们有大量的桶,每个桶在外面有一个四个字母的单词,四个字母当中有一个使用下划线来替代。
我们遍历所有的单词,将他们放置到对应的桶当中,这样在一个桶中的所有单词都必须连接。

使用字典来实现上面描述的想法,桶上的标签是字典中的键,该键存储的是单词列表,一旦创建了字典,我们接着就可以创建图:

from Graph import *

def buildGraph(wordFile):
    d = {}
    g = Graph()

    #从文件中读取单词
    wfile = open(wordFile,'r')

    #遍历单词创建桶,将相应的元素添加到桶中
    for line in wfile:
        word = line[:-1]
        for i in range(len(word)):
            bucket = word[:i] + '_' + word[i+1:]
            if bucket in d:
                d[bucket].append(word)
            else:
                d[bucket] = [word]
    # 遍历桶,建立同一个桶中所有元素之间的边
    for bucket in d.keys():
        for word1 in d[bucket]:
            for word2 in d[bucket]:
                if word1 != word2:
                    g.addEdge(word1,word2)

    return  g
posted @ 2019-01-12 22:07  youngliu91  阅读(405)  评论(0编辑  收藏  举报