Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40267
  • 博文数量: 37
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 372
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-12 23:27
文章分类

全部博文(37)

文章存档

2014年(5)

2013年(32)

我的朋友

分类: C/C++

2013-11-23 14:33:45

其实画个图一下就理解了。比如start为hot,end为dog,词典为(hot,dog,dot)
很简单最短的转换是
           hot
            |
           dot
            |
            dog

也就是采用广度优先,从start开始,找出其所有临近词,然后再从找到的临近词开始找它们的临近词语,找到end即停止。这里需要注意的就是,每一个已经找到的词我们都得把它从dict中删去,以免搜寻过程又回走了。比如上图,我们在找寻dot的临近词的时候,就不会找到hot,因为hot已经被处理,我们把它从词典中删掉了。



点击(此处)折叠或打开

  1. class Solution {
  2. public:
  3.     int ladderLength(string start, string end, unordered_set<string> &dict) {
  4.         // Note: The Solution object is instantiated only once and is reused by each test case.
  5.         int mindepth=0;
  6.         int flag=false;
  7.         vector<string> adj1;
  8.         vector<string> adj2;
  9.         adj2.push_back(start);
  10.         dict.erase(start);
  11.         
  12.         while(!adj2.empty())
  13.         {
  14.             mindepth++;
  15.             adj1=adj2;
  16.             adj2.clear();
  17.             for(int i=0; i<adj1.size();i++)
  18.             {
  19.                 string s=adj1[i];
  20.                 for(int i=0;i<s.length();i++)
  21.                 {
  22.                     char origchar=s[i];
  23.                     for(char c='a';c<='z';c++)
  24.                     {
  25.                         if(c!=origchar)
  26.                         {
  27.                             s[i]=c;
  28.                             if(s==end) return ++mindepth;
  29.                             if(dict.count(s)) {adj2.push_back(s); dict.erase(s);}
  30.                         }
  31.                     }
  32.                     s[i]=origchar;
  33.                 }
  34.             }
  35.         }
  36.         return 0;
  37.     }
  38. };


阅读(227) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~