当前位置:   article > 正文

LeetCode:实现单词接龙_leetcode 从开始字符转换到结束字符串

leetcode 从开始字符转换到结束字符串
  1. 给定一个起始字符串和一个终止字符串,以及一个单词表,求是否可以将起始字符串酶促改一个字符,
  2. 直到改成终止字符串,且所有中间的修改过程表示的字符串都可以在单词表里面找到.若存在,输出
  3. 需要修改次数最少的所有更改方式.
  4. 示例 1
  5. Input:beginWord="hit",endWord="cog",wordList=["hot","dot","lot","log","cog"]
  6. Output:[["hit","hot","dog","cog"],
  7. ["hit","hot",log","cog"]]
  8. 解题思路:
  9. 我们可以把起始字符串,终止字符串,以及单词表里面所有的字符串想象成节点.若两个字符串只有一个字符不同,
  10. 那么它们相连.因为题目需要输出修改次数最少的所有修改方式,因此可以使用广度优先搜索,求得起始节点到
  11. 终止节点的最短距离.
  12. 同时还使用一个小技巧:并不是直接从起始节点进行广度优先搜索,直到找到终止节点为止:而是从起始节点和
  13. 终止节点分别进行广度优先搜索,每次只延展当前层节点数最少的那一端,这样可以减少搜索的总结点数.举例来说,
  14. 假设最短距离为4,如果只从一端搜索4层,总遍历节点数最多是1+2+4+8+16=31;而如果从两端各搜索两层,总
  15. 遍历节点数最多只有2x(1+2+4)=14;
  16. 在搜索结束后,还需要通过回溯法来重建所有可能的路径.
  1. #include <iostream>
  2. #include <vector>
  3. #include <unordered_set>
  4. #include <unordered_map>
  5. #include <algorithm>
  6. using namespace std;
  7. class Solution{
  8. public:
  9. vector<vector<string>> findLadders(string beginWord,string endWord,vector<string>& wordList){
  10. vector<vector<string>> ans;
  11. unordered_set<string> dict;
  12. for(const auto&w:wordList)
  13. dict.insert(w);
  14. if(!dict.count(endWord))/*set容器查找,返回0或者1*/
  15. return ans;
  16. dict.erase(beginWord);
  17. dict.erase(endWord);
  18. unordered_set<string> q1{beginWord},q2{endWord};
  19. unordered_map<string,vector<string>> next;
  20. bool reversed=false,found=false;
  21. /*广度优先遍历*/
  22. while(!q1.empty()){
  23. unordered_set<string> q;
  24. for(const auto&w:q1){
  25. string s=w;
  26. for(size_t i=0;i<s.size();i++){
  27. char ch=s[i];
  28. for(size_t j=0;j<26;j++){
  29. s[i]=j+'a';
  30. if(q2.count(s)){
  31. reversed?next[s].push_back(w):next[w].push_back(s);
  32. found=true;
  33. }
  34. if(dict.count(s)){
  35. reversed?next[s].push_back(w):next[w].push_back(s);
  36. cout<<s<<endl;
  37. q.insert(s);
  38. }
  39. }
  40. s[i]=ch;
  41. }
  42. }
  43. if(found){
  44. break;
  45. }
  46. for(const auto& w:q){
  47. dict.erase(w);
  48. }
  49. if(q.size()<=q2.size()){
  50. q1=q;
  51. }else{
  52. reversed=!reversed;
  53. q1=q2;
  54. q2=q;
  55. }
  56. }
  57. /*回溯符合条件的路径*/
  58. if(found){
  59. vector<string> path={beginWord};
  60. backtrack(beginWord,endWord,next,path,ans);
  61. }
  62. return ans;
  63. }
  64. private:
  65. void backtrack(const string& src,const string& dst,unordered_map<string,
  66. vector<string>>&next,vector<string>&path,vector<vector<string>>& ans){
  67. if(src==dst){
  68. ans.push_back(path);
  69. return;
  70. }
  71. for(const auto&s:next[src]){
  72. path.push_back(s);
  73. backtrack(s,dst,next,path,ans);
  74. path.pop_back();
  75. }
  76. }
  77. };
  78. int main(int argc,char* argv[]){
  79. string beginWord="hit",endWord="cog";
  80. vector<string> wordList={"hot","dot","lot","log","cog"};
  81. vector<vector<string>> ans=Solution().findLadders(beginWord,endWord,wordList);
  82. for_each(ans.begin(),ans.end(),[](vector<string>& res){
  83. cout<<"[ ";
  84. for(const auto&i:res)
  85. cout<<i<<" ";
  86. cout<<"]";
  87. });
  88. return 0;
  89. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/144301
推荐阅读
相关标签
  

闽ICP备14008679号