我正在尝试解决以下问题。
您将获得一个起始单词,一个字典和一个结束单词。您可以执行4个操作。
这些操作的所有成本可能会有所不同,也会给出。
约束:所有中间字母以及起始字和结束字必须出现在字典中。找到实现这一目标的最低可能成本。
如果没有办法返回-1;
有什么想法吗?
答案 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)