zoukankan      html  css  js  c++  java
  • LeetCode126:Word Ladder

    题目:

    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中删除,以免重复处理。
    • 实现代码:
    • #include <iostream>
      #include <string>
      #include <queue>
      #include <unordered_set>
      using namespace std;
      
      /*
      Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:
      
      Only one letter can be changed at a time
      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.
      */
      class Solution {
      public:
          int ladderLength(string start, string end, unordered_set<string> &dict) {
              if(start.empty() || end.empty() || dict.empty())
                  return 0;
              queue<string> squ[2];//这里需要用到两个队列,因为是bfs,按层遍历,所以需要一层一层进行处理 
              squ[0].push(start);
              bool qid = false;
              int minLen = 1;
              while(!squ[qid].empty())
              {
                  while(!squ[qid].empty())//处理同一层节点 
                  {
                      string curstr = squ[qid].front();
                      squ[qid].pop();
                      for(int i = 0; i < curstr.size(); i++)
                      {
                          
                          for(char j = 'a'; j <= 'z'; j++)
                          {
                              if(j == curstr[i])
                                  continue;
                              char t = curstr[i];
                              curstr[i] = j;
                              if(curstr == end)
                              {
                                  return minLen+1;
                              }
                                  
                              if(dict.count(curstr) > 0)
                              {
                                  squ[!qid].push(curstr);
                                  dict.erase(curstr);
                              }
                              curstr[i] = t;
                          }
                          
                      }
                                  
                  }
                  qid = !qid;//表示将要处理的下一层 
                  minLen++;
      
              }
              return 0;
              
          }
      };
      
      int main(void)
      {
          string start("hit");
          string end("cog");
          unordered_set<string> dict;
          dict.insert("hot");
          dict.insert("dot");
          dict.insert("dog");
          dict.insert("lot");
          dict.insert("log");
          Solution solution;
          int min = solution.ladderLength(start, end, dict);
          cout<<min<<endl;
          return 0;
      }
  • 相关阅读:
    UI/UE对个性化推荐的影响
    毫秒转换为天、小时、分、秒
    查生字
    探秘推荐引擎之协同过滤算法小综述
    给文献添加上标
    雅可比迭代和高斯赛德尔迭代
    广义二项式定理求解系数
    关于最大流的EdmondsKarp算法详解
    海量数据处理利器之布隆过滤器
    [leetcode] Path sum路径之和
  • 原文地址:https://www.cnblogs.com/mickole/p/3694896.html
Copyright © 2011-2022 走看看