对于数据结构项目,我必须找到像“cat”和“dog”这样的两个词之间的最短路径,但我一次只能更改一个字母。我试图通过实现 trie 来做到这一点,并且可以似乎无法实现最短路径搜索。
猫 -> 婴儿床 -> cog -> 狗
所有单词的长度都相同,我从字典文件中填充它们。我们必须逐字逐句。所以中间的词必须是有效的词。
我认为使用 trie 是不可能的,但有人知道吗?
对于数据结构项目,我必须找到像“cat”和“dog”这样的两个词之间的最短路径,但我一次只能更改一个字母。我试图通过实现 trie 来做到这一点,并且可以似乎无法实现最短路径搜索。
猫 -> 婴儿床 -> cog -> 狗
所有单词的长度都相同,我从字典文件中填充它们。我们必须逐字逐句。所以中间的词必须是有效的词。
我认为使用 trie 是不可能的,但有人知道吗?
您想使用VP-Tree ,该算法称为Levenshtein 距离
AC 实现可以在这里找到,代码太长,无法作为答案发布:
C VP-Tree
对于这类问题,一个更好的数据结构是图。它被称为单词阶梯,您可以在此处查找:http ://en.wikipedia.org/wiki/Word_ladder 。
您正在寻找的是一个简单的 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]
}