Word Ladder

Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:

  1. Only one letter can be changed at a time
  2. Each intermediate word must exist in the dictionary

For example,

Given:
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]

As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
return its length 5.

Note:

    • Return 0 if there is no such transformation sequence.
    • All words have the same length.
    • All words contain only lowercase alphabetic characters.

这道题目首先想到的是DFS,或曰backtracking,也就是每次都找到一个可能的路径,最后比较所有路径中最小的就是题目所求。这样做显然需要较多的时间,因为我们遍历了所有的可能性。那么,有没有更加快捷的方案呢?
答案是显然的,那就是BFS。CareerCup上有这道题目,当时没有注意总结成这么抽象的方法,这次一定要好好总结一下。首先,虽然题目中没有一个“图”的概念,但是我们可以假想构建一个图,其中图中的每个顶点都是我们的元素,点和点是如何联系起来的呢?如果一个单词通过改变一次字母,能够变成另外一个单词,我们称之为1 edit distance 距离(是不是想起了leetcode中edit distance那道题目了?)所以,图中的所有相邻元素都是edit distance 距离为1的元素。那么,我们只需要做BFS,哪里最先遇到我们的target word,那么我们的距离就是多少。如果遍历完所有的元素都没有找到target word,那么我们就返回1。
另外一个需要注意的地方就是,如果我们曾经遍历过某个元素,我会将其从字典中删除,以防以后再次遍历到这个元素。这里有几种情况:
1.以后再也遍历不到这个元素,那么我们删除它当然没有任何问题。
2.我们以后会遍历到该元素,又分为两种情况:
(1)在本层我们就能遍历到该元素。也就是说,我们到达这个元素有两条路径,而且它们都是最短路径。
举一个例子应该比较容易理解:比如hot->hog->dog->dig和hot->dot->dog->dig,那么在第一次遍历距离hot为1的元素时,我们找到了hog和dot。对hog遍历时,我们找到了dog,并且将其从字典中删除。那么在遍历距离dot为1的元素时,我们实际上是找不到dog的,因为已经被删除了。对于本题来说,是没有什么影响的,因为到dog距离都是3,到dig距离都是4。但是后面我们做word ladder 2的时候,如果没有考虑这个情况,将是非常致命的,因为题目要求输出最短路径的所有情况,我们稍后讨论相关问题
(2)在更下层我们才能够遍历到该元素。比如hot->dot->dog->dig和hot->hat->dat->dag->dog->dig,如果第一次我们找到了dog并且将其删除,那么第二次我们实际上是找不到这个元素的。这样对于本题来说,没有任何影响。对于word ladder 2来说,因为也是要输出最短路径,所以也不会有任何影响。但是倘若我们要输出从起点到终点的所有路径,那么我们就要小心这种情况了。参考:http://blog.csdn.net/zxzxy1988/article/details/8591890

 

这道题看似一个关于字符串操作的题目,其实要解决这个问题得用图的方法。我们先给题目进行图的映射,顶点则是每个字符串,然后两个字符串如果相差一个字符则我们进行连边。接下来看看这个方法的优势,注意到我们的字符集只有小写字母,而且字符串长度固定,假设是L。那么可以注意到每一个字符可以对应的边则有25个(26个小写字母减去自己),那么一个字符串可能存在的边是25*L条。接下来就是检测这些边对应的字符串是否在字典里,就可以得到一个完整的图的结构了。根据题目的要求,等价于求这个图一个顶点到另一个顶点的最短路径,一般我们用广度优先搜索。这个算法中最坏情况是把所有长度为L的字符串都看一下,或者把字典中的字符串都看一下,而长度为L的字符串总共有26^L,所以时间复杂度是O(min(26^L, size(dict)),空间上需要存储访问情况,也是O(min(26^L, size(dict))。

 

C++实现代码:

#include<iostream>
#include<string>
#include<unordered_set>
#include<queue>
using namespace std;

class Solution
{
public:
    int ladderLength(string start, string end, unordered_set<string> &dict)
    {
        if(start.empty()||end.empty()||dict.empty())
            return 0;
        int level=1;
        int count=0;
        int curr=0;
        int i;
        queue<string> q;
        q.push(start);
        count++;
        while(!q.empty())
        {
            string tmp=q.front();
            q.pop();
            count--;
            for(i=0; i<(int)tmp.size(); i++)
            {
                char ctmp=tmp[i];
                for(char c='a'; c<='z'; c++)
                {
                    if(tmp[i]==c)
                        continue;
                    tmp[i]=c;
                    if(tmp==end)
                        return level+1;
                    if(dict.count(tmp)>0)
                    {
                        q.push(tmp);
                        curr++;
                        dict.erase(tmp);
                    }
                    tmp[i]=ctmp;
                }
            }
            if(count==0)
            {
                level++;
                count=curr;
                curr=0;
            }
        }
        return 0;
    }
};

int main()
{
    Solution s;
    string start = "hot";
    string end = "dog";
    unordered_set<string> dict = {"hot","dog"};
    cout<<s.ladderLength(start,end,dict)<<endl;
}

 

时间: 2024-10-08 13:30:14

Word Ladder的相关文章

[LeetCode]127.Word Ladder

题目 Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that: Only one letter can be changed at a time Each intermediate word must exist in the dictionary For example, Given: s

leetcode难度及面试频率

转载自:LeetCode Question Difficulty Distribution               1 Two Sum 2 5 array sort         set Two Pointers 2 Add Two Numbers 3 4 linked list Two Pointers           Math 3 Longest Substring Without Repeating Characters 3 2 string Two Pointers      

LeetCode总结【转】

转自:http://blog.csdn.net/lanxu_yy/article/details/17848219 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近完成了www.leetcode.com的online judge中151道算法题目.除各个题目有特殊巧妙的解法以外,大部分题目都是经典的算法或者数据结构,因此做了如下小结,具体的解题思路可以搜索我的博客:LeetCode题解 题目 算法 数据结构 注意事项 Clone Graph BFS 哈希表 Word Ladder II

LeetCode All in One 题目讲解汇总(持续更新中...)

终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通过OJ,或是有更好的解法,或是有任何疑问,意见和建议的话,请一定要在对应的帖子下面评论区留言告知博主啊,多谢多谢,祝大家刷得愉快,刷得精彩,刷出美好未来- 博主制作了一款iOS的应用"Leetcode Meet Me",里面有Leetcode上所有的题目,并且贴上了博主的解法,随时随地都能

[LeetCode] Minimum Genetic Mutation 最小基因变化

A gene string can be represented by an 8-character long string, with choices from "A", "C", "G", "T". Suppose we need to investigate about a mutation (mutation from "start" to "end"), where ONE m

word文档-如何在360浏览器中直接 打开word文件 ?

问题描述 如何在360浏览器中直接 打开word文件 ? 在IE浏览器中可以.碰到WORD文档,自动就下载了!为什么? 解决方案 需要有浏览器插件,IE一般有OFFICE插件,所以可以直接打开 解决方案二: 因为360是非法流氓软件,它根本就是粗陋地用IE的内核拼凑了一个山寨的浏览器,做一个稍微有点用的软件功能只是它实施违法犯罪侵害用户计算机和数据的幌子而已. 解决方案三: 这个好像需要转换吧.吧word转成pdf格式的然后在线显示!

pdf转word转换器在线使用教程

迅捷在线PDF转换成Word转换器使用教程: 步骤1:打开迅捷在线pdf转换成word转换器网页,选择"PDF转word"模式.其它3种转换模式操作步骤都差不多,大家根据下面步骤操作即可. 步骤2:点击"选择文件"按钮,选择需要转换的PDF文件,上传到云端服务器中. 步骤3:上传完毕后,点击"生成word文档"按钮,开始对上传的pdf文件内容进行转换. 步骤4:转换完成,下载转换完成的word文件. 步骤5:大家可以打开pdf文件和转换的word

Word中MathType菜单消失该怎么找回来?

  在使用MathType编辑公式时,有许多朋友都会对MathType出现的一些问题无法解决,比如Word中MathType菜单项突然消失了,如何才能找回来? 1.先卸载MathType再重新安装MathType,MathType会在相应office surpport目录下添加WordCmds.dot,MathType Commands 6 For Word.dot,MathPage目录下添加"32"文件夹中(或者"64"具体看自己电脑的安装情况)MathPage.

Word怎么打开MathType

  方法一:在Word中利用MathType选项卡 一般在正常安装MathType后,MathType会自动嵌入到Office的相关办公软件中,出现一个MathType选项菜单,如果没的话,可以再加载一次,加载的具体操作方法请参考教程:教您在word中添加MathType加载项. 1.点击MathType选项卡. 2.点击选项卡菜单中的"插入内联公式(Insert Inline Equation)",或者是"插入显示公式(Insert Display Equation)&qu