图论第5天

花瓣小跑  金牌会员 | 2024-6-24 19:07:56 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 637|帖子 637|积分 1911

 127.单词接龙
 需要cout看一下过程。
  1. #include <iostream>
  2. #include <queue>
  3. #include <stack>
  4. #include <unordered_map>
  5. #include <unordered_set>
  6. #include <vector>
  7. using namespace ::std;
  8. class Solution
  9. {
  10. public:
  11.     int ladderLength(string beginWord, string endWord, vector<string> &wordList)
  12.     {
  13.         unordered_set<string> wordSet(wordList.begin(), wordList.end()); // 换成unordered_set后查询速度增加
  14.         if (wordSet.find(endWord) == wordSet.end())
  15.             return 0;
  16.         unordered_map<string, int> visitMap; //<word,查询到的路径长度>
  17.         queue<string> que;
  18.         que.push(beginWord);
  19.         visitMap.insert(pair<string, int>(beginWord, 1));
  20.         while (!que.empty())
  21.         {
  22.             string cur_word = que.front();
  23.             que.pop();
  24.             int path = visitMap[cur_word];
  25.             for (int i = 0; i < cur_word.size(); i++)
  26.             {
  27.                 string new_word = cur_word;
  28.                 for (int j = 0; j < 26; j++)
  29.                 {
  30.                     new_word[i] = j + 'a';
  31.                     if (new_word == endWord)
  32.                         return path + 1;
  33.                     if (wordSet.find(new_word) != wordSet.end() && visitMap.find(new_word) == visitMap.end())
  34.                     {
  35.                         visitMap.insert(pair<string, int>(new_word, path + 1));
  36.                         que.push(new_word);
  37.                     }
  38.                 }
  39.                 cout << cur_word << endl;
  40.                 cout << i << endl;
  41.                 for (pair<string, int> x : visitMap)
  42.                 {
  43.                     cout << "visitMap[" << x.first << "] = " << x.second << "   ";
  44.                 }
  45.                 cout << endl;
  46.             }
  47.         }
  48.         return 0;
  49.     }
  50. };
  51. int main()
  52. {
  53.     Solution syz;
  54.     string beginWord = "hit", endWord = "cog";
  55.     vector<string> wordList;
  56.     wordList.push_back("hot");
  57.     wordList.push_back("dot");
  58.     wordList.push_back("dog");
  59.     wordList.push_back("lot");
  60.     wordList.push_back("log");
  61.     wordList.push_back("cog");
  62.     syz.ladderLength(beginWord, endWord, wordList);
  63.     return 0;
  64. }
复制代码
cout运行效果需要看一下,明白一下过程:
所有的word的字母都需要执行一次,以是是0、1、2,
hit 改 h是没有单词加入的,改i会有个hot,改t没有单词加入,以是visitMap里不变。hit这时候已经pop()。
hot改h,增加两个dot\lot,改o\t没有,hot.pop()。
竟然是先dot后lot,跟push顺有关。hot会先push “ d ” 后 push " l "
dot,d\o都没有,t改完,出现一个dog,g会继续往下走,dot.pop() 
lot,l\o都没有,出现log.pop()
这时候que里,front 是dog,然后是 log
dog直接知道cog。visitMap[dog] = 4,4 + 1 = 5
  1. hit
  2. 0
  3. visitMap[hit] = 1
  4. hit
  5. 1
  6. visitMap[hot] = 2   visitMap[hit] = 1
  7. hit
  8. 2
  9. visitMap[hot] = 2   visitMap[hit] = 1
  10. hot
  11. 0
  12. visitMap[dot] = 3   visitMap[lot] = 3   visitMap[hot] = 2   visitMap[hit] = 1
  13. hot
  14. 1
  15. visitMap[dot] = 3   visitMap[lot] = 3   visitMap[hot] = 2   visitMap[hit] = 1
  16. hot
  17. 2
  18. visitMap[dot] = 3   visitMap[lot] = 3   visitMap[hot] = 2   visitMap[hit] = 1
  19. dot
  20. 0
  21. visitMap[dot] = 3   visitMap[lot] = 3   visitMap[hot] = 2   visitMap[hit] = 1
  22. dot
  23. 1
  24. visitMap[dot] = 3   visitMap[lot] = 3   visitMap[hot] = 2   visitMap[hit] = 1
  25. dot
  26. 2
  27. visitMap[dog] = 4   visitMap[dot] = 3   visitMap[lot] = 3   visitMap[hot] = 2   visitMap[hit] = 1
  28. lot
  29. 0
  30. visitMap[dog] = 4   visitMap[dot] = 3   visitMap[lot] = 3   visitMap[hot] = 2   visitMap[hit] = 1
  31. lot
  32. 1
  33. visitMap[dog] = 4   visitMap[dot] = 3   visitMap[lot] = 3   visitMap[hot] = 2   visitMap[hit] = 1
  34. lot
  35. 2
  36. visitMap[log] = 4   visitMap[dog] = 4   visitMap[dot] = 3   visitMap[lot] = 3   visitMap[hot] = 2   visitMap[hit] = 1
复制代码
广搜更得当这道题,会把所有大概性在起始点周边的大概性,一点点往外扩,不会造成走冤枉路。
图论看来一道题就要很刺激啊。 T _ T。明天摸鱼看能不能做两道吧。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

花瓣小跑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表