题目:

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.
  • 解题思路:
  • 这题一开始没啥思路,谷歌一下,才知要用到BFS,既然要用到BFS,那当然形成一个抽象图。这里我们将每一个字符串当做图中一节点,如果两字符串只需通过变化一个字符即可相等,我们认为这两字符串相连。
  • 遍历图中节点时,我们通常会利用一个visit还标识是否访问过,这里我们将处理过的节点直接从dict中删除,以免重复处理。
  • 实现代码:
    1. #include <iostream>
    2. #include <string>
    3. #include <queue>
    4. #include <unordered_set>
    5. using namespace std;
    6.  
    7. /*
    8. Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:
    9.  
    10. Only one letter can be changed at a time
    11. Each intermediate word must exist in the dictionary
    12. For example,
    13.  
    14. Given:
    15. start = "hit"
    16. end = "cog"
    17. dict = ["hot","dot","dog","lot","log"]
    18. As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
    19. return its length 5.
    20.  
    21. Note:
    22. Return 0 if there is no such transformation sequence.
    23. All words have the same length.
    24. All words contain only lowercase alphabetic characters.
    25. */
    26. class Solution {
    27. public:
    28. int ladderLength(string start, string end, unordered_set<string> &dict) {
    29. if(start.empty() || end.empty() || dict.empty())
    30. return 0;
    31. queue<string> squ[2];//这里需要用到两个队列,因为是bfs,按层遍历,所以需要一层一层进行处理
    32. squ[0].push(start);
    33. bool qid = false;
    34. int minLen = 1;
    35. while(!squ[qid].empty())
    36. {
    37. while(!squ[qid].empty())//处理同一层节点
    38. {
    39. string curstr = squ[qid].front();
    40. squ[qid].pop();
    41. for(int i = 0; i < curstr.size(); i++)
    42. {
    43.  
    44. for(char j = 'a'; j <= 'z'; j++)
    45. {
    46. if(j == curstr[i])
    47. continue;
    48. char t = curstr[i];
    49. curstr[i] = j;
    50. if(curstr == end)
    51. {
    52. return minLen+1;
    53. }
    54.  
    55. if(dict.count(curstr) > 0)
    56. {
    57. squ[!qid].push(curstr);
    58. dict.erase(curstr);
    59. }
    60. curstr[i] = t;
    61. }
    62.  
    63. }
    64.  
    65. }
    66. qid = !qid;//表示将要处理的下一层
    67. minLen++;
    68.  
    69. }
    70. return 0;
    71.  
    72. }
    73. };
    74.  
    75. int main(void)
    76. {
    77. string start("hit");
    78. string end("cog");
    79. unordered_set<string> dict;
    80. dict.insert("hot");
    81. dict.insert("dot");
    82. dict.insert("dog");
    83. dict.insert("lot");
    84. dict.insert("log");
    85. Solution solution;
    86. int min = solution.ladderLength(start, end, dict);
    87. cout<<min<<endl;
    88. return 0;
    89. }

LeetCode126:Word Ladder的更多相关文章

  1. LeetCode127:Word Ladder II

    题目: Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) ...

  2. leetcode笔记:Word Ladder

    一. 题目描写叙述 Given two words (start and end), and a dictionary, find the length of shortest transformat ...

  3. [LeetCode] Word Ladder 词语阶梯

    Given two words (beginWord and endWord), and a dictionary, find the length of shortest transformatio ...

  4. [LeetCode] Word Ladder II 词语阶梯之二

    Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...

  5. [LeetCode] 126. Word Ladder II 词语阶梯之二

    Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...

  6. LeetCode:Word Ladder I II

    其他LeetCode题目欢迎访问:LeetCode结题报告索引 LeetCode:Word Ladder Given two words (start and end), and a dictiona ...

  7. 18. Word Ladder && Word Ladder II

    Word Ladder Given two words (start and end), and a dictionary, find the length of shortest transform ...

  8. [Leetcode][JAVA] Word Ladder II

    Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...

  9. 【题解】【字符串】【BFS】【Leetcode】Word Ladder

    Given two words (start and end), and a dictionary, find the length of shortest transformation sequen ...

随机推荐

  1. [GraphQL] Use Arguments in a GraphQL Query

    In GraphQL, every field and nested object is able to take in arguments of varying types in order to ...

  2. cocos2dx 2.x 骨骼动画优化

    本文原链接:http://www.cnblogs.com/zouzf/p/4450861.html 公司用的骨骼动画的版本貌似还停留在2.1之前的年代而已没有更新,该因各种历史原因吧,而有个大项目“一 ...

  3. JavaScript封装Ajax(类JQuery中$.ajax()方法)

    ajax.js (function(exports, document, undefined){ "use strict"; function Ajax(){ if(!(this ...

  4. android xml 常用控件介绍

    android常用控件介绍 ------文本框(TextView)     ------列表(ListView)     ------提示(Toast)     ------编辑框(EditText) ...

  5. 【翻译】C# Tips & Tricks: Weak References - When and How to Use Them

    原文:C# Tips & Tricks: Weak References - When and How to Use Them Sometimes you have an object whi ...

  6. 爬虫技术 -- 进阶学习(七)简单爬虫抓取示例(附c#代码)

    这是我的第一个爬虫代码...算是一份测试版的代码.大牛大神别喷... 通过给定一个初始的地址startPiont然后对网页进行捕捉,然后通过正则表达式对网址进行匹配. List<string&g ...

  7. sqlserver -- 学习笔记(七)获取同组数据的前两条记录

    不啰嗦,直接上图,大概实现效果如下: 有上面这样一份数据,将他们按照userAccount和submitTime进行分组,然后提前每组数据的前两条记录 提取后数据如下: 实现的SQL如下: selec ...

  8. AVL树(二)之 C++的实现

    概要 上一章通过C语言实现了AVL树,本章将介绍AVL树的C++版本,算法与C语言版本的一样. 目录 1. AVL树的介绍2. AVL树的C++实现3. AVL树的C++测试程序 转载请注明出处:ht ...

  9. 【转载】关于 Ubuntu 的小知识分享

    转载自:http://os.51cto.com/art/201307/402197.htm 一.默认开机直接进入到Ubuntu命令行界面 安装Ubuntu后,开机会默认进入到图形界面,如果不喜欢图形界 ...

  10. python进阶学习笔记(四)--多线程thread

    在使用多线程之前,我们首页要理解什么是进程和线程. 什么是进程? 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据.它们只有在被读取到内存中,被操作系统调用的时候才开始它们的生命期.进程( ...