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

全部博文(37)

文章存档

2014年(5)

2013年(32)

我的朋友

分类: C/C++

2013-11-23 20:46:31

广度优先。
从start出发,每一轮都是找从上一轮已经发现的词出发能发现的词,在找到end的那一轮后停止,然后反向找出路径。路径信息保存在preMap。
比如start=hot,end=dog,dict={hot,dog,hog,dot}
hot
|
---------
|       |
hog   dot
|       |
dog   dog
再反向找出路径{hot,hog,dog}和{hot,dot,dog}即可。


点击(此处)折叠或打开

  1. class Solution {
  2. public:
  3.     void getTrans(vector<string> &tmp, unordered_map<string, vector<string>> &pre, string &end)
  4.     {
  5.         tmp.push_back(end);
  6.         if(pre[end].empty())
  7.             re.push_back(vector<string>(tmp.rbegin(),tmp.rend()));
  8.         for(auto itr=pre[end].begin();itr!=pre[end].end();itr++)
  9.             getTrans(tmp,pre,*itr);
  10.         tmp.pop_back();
  11.     }
  12.     vector<vector<string>> findLadders(string start, string end, unordered_set<string> &dict) {
  13.         // IMPORTANT: Please reset any member data you declared, as
  14.         // the same Solution instance will be reused for each test case.
  15.         re.clear();
  16.         if(dict.empty()) return re;
  17.         unordered_map<string, vector<string>> preMap;
  18.         vector<unordered_set<string>> bfs(2);
  19.         bfs[1].insert(start);
  20.         int pre=0;
  21.         int curr=1;
  22.         while(1)
  23.         {
  24.             pre=!pre;
  25.             curr=!curr;
  26.             bfs[curr].clear();
  27.             for(auto itr=bfs[pre].begin();itr!=bfs[pre].end();itr++) dict.erase(*itr);
  28.             for(auto itr=bfs[pre].begin();itr!=bfs[pre].end();itr++)
  29.             {
  30.                 string s=(*itr);
  31.                 for(int i=0;i<s.length();i++)
  32.                 {
  33.                     char origchar=s[i];
  34.                     for(char c='a';c<='z';c++)
  35.                     {
  36.                         if(c!=origchar)
  37.                         {
  38.                             s[i]=c;
  39.                             if(dict.count(s)) {preMap[s].push_back(*itr); bfs[curr].insert(s);}
  40.                         }
  41.                     }
  42.                     s[i]=origchar;
  43.                 }
  44.             }
  45.             if(bfs[curr].count(end)) break;
  46.             if(bfs[curr].empty()) return re;
  47.         }
  48.         vector<string> tmp;
  49.         getTrans(tmp,preMap,end);
  50.         return re;
  51.     }
  52. private:
  53.     vector<vector<string>> re;
  54. };

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