特里的最短路径

时间:2013-03-08 17:36:43

标签: c++ algorithm data-structures shortest-path trie

对于Data Structures项目,我必须找到两个单词之间的最短路径,如“cat”和“dog,但我只允许一次更改一个字母。我正在尝试通过实现trie来实现,似乎无法实现最短路径搜索。

cat - >婴儿床 - > cog - >狗

所有单词的长度都相同,我从字典文件中填充它们。 我们必须一个接一个地移动。所以中间的词必须是一个有效的词。

我认为使用trie不太可能,但是任何人都有任何知识吗?

3 个答案:

答案 0 :(得分:5)

您想使用VP-Tree,该算法称为Levenshtein distance 这里可以找到一个C实现,代码太长而不能作为答案发布:
C VP-Tree

答案 1 :(得分:1)

针对此类问题的更好的数据结构是图形。 它被称为字梯,你可以在这里查找:http://en.wikipedia.org/wiki/Word_ladder

答案 2 :(得分:-2)

您正在寻找的是一个简单的BFS。每个单词都是一个图形顶点,但是甚至不需要构建图形,你可以使用单词数组来解决它:

words = {"cat", "dog", "dot", "cot"}
mark = {0, 0, 0, 0}
distance = {0, 0, 0, 0}
queue Q
start_word_index = 0; // words[0] -> "cat"
destination_word_index = 1; // words[1] -> "dog"
Q.push(start_word_index)
while(Q is not empty) {
    word_index = Q.pop()
    for each `words[j]` {
        if (difference between `words[word_index]` and `words[j]` is only 1 character) AND
           (`mark[j]` is not 1) {
            mark[j] = 1
            Q.push(j)
            distance[j] = distance[word_index] + 1
        }
    }
}

if mark[destination_word_index] is 0 {
    print "Not reachable"
} else {
    print "Distance is ", distance[destination_word_index]
}