最短费用的单词转换

时间:2017-09-24 07:01:52

标签: algorithm data-structures graph-algorithm

我正在尝试解决以下问题。

您将获得一个起始单词,一个字典和一个结束单词。您可以执行4个操作。

  1. 在任何位置添加一个字母
  2. 删除任何位置的信件
  3. 在任何位置替换字母
  4. 用字谜(猫可以改为行动)。
  5. 这些操作的所有成本可能会有所不同,也会给出。

    约束:所有中间字母以及起始字和结束字必须出现在字典中。找到实现这一目标的最低可能成本。

    如果没有办法返回-1;

    有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我想你应该告诉我有关约束的更多细节(比如单词的最大长度或字典中的最大单词数)。

但我会告诉你解决这个问题的一个解决方案。

首先,你可以制作图表。每个节点都是你可以制作的单词(在字典中),而edge是你可以做的操作。

每条边都有从输入中给出的重量。然后你应该保存从开始单词到字典中每个其他单词的距离。在C ++中,您可以声明map<string, int>

该地图的关键是节点字符串,该地图的值是与初始字的距离。

然后你可以使用像dijkstra这样的最短距离算法。起点是初始词,终点是我们想要的词。因为Dijkstra是最快的算法,通常有一个起点,如果我是你,我会用它。

然后,让我们计算时间复杂度。

假设每个单词的最大长度为S,字典中的最大单词数为N.

在每个操作中,如果你改变一些字符的位置或者在某个位置添加或删除一个字符(除了单词的后面),它需要O(S),如果你只是改变一个字符,则需要O(1)。

无论如何总时间复杂度是O(SNlgN)因为我们图表中的最大节点数是字典中的最大字数cuz如果字典中有任何单词我们可以从现在的单词中创建,那么我们不能再从当前节点边缘。

并且最大边数是O(N)因为我们最多可以在每个节点中产生4条边。因此,如果您知道Dijkstra的堆时间复杂度,那很简单。

答案 1 :(得分:0)

我想你应该告诉我关于约束的更多细节(比如单词的最大长度或字典中的最大单词数)。 但我会告诉你一些解决这个问题的方法。 首先,你可以制作图表。每个节点都是您可以制作的单词(在字典中),而edge是您可以执行的操作。每个边缘都有从输入给出的重量。在C ++中,您可以声明map <string, int>。该映射的关键是节点字符串,该映射的值是与初始字的距离。 然后你可以使用像dijkstra这样的最短距离算法。因为Dijkstra是最快的算法,通常有一个起点,如果我是你,我会使用它。然后,让我们计算时间复杂度。假设每个单词的最大长度为S,字典中的最大单词数为N.在每个操作中,如果您可能更改某些字符的位置或在某个位置添加或删除某个字符,则需要O(S)

这个词