C++ 词语阶梯

已知两个单词(分别是起始单词与结束单词),一个单词词典,根据转换规则计算从起始单词到结束单词的最短转换步数。
转换规则如下:

  1. 在转换时,只能转换单词中的1个字符。
  2. 转换得到的新单词,必须在单词词典中。
    例如:beginWord=“hit”; endWord=“cog”; wordList=[“hot”,“dot”,“dog”,“lot”,“log”,“cog”]
    最短转换方式:“hit”->“hot”->“dot”->“dog”->“cog”,结果为5。
#include<string>
#include<vector>
#include<map>
#include<queue>
#include<set>
bool connect(std::string& word1, std::string& word2)
{
 int cnt = 0;
 for (int i = 0; i < word1.length(); i++)
 {
  if (word1[i]!=word2[i])
  {
   cnt++;
  }
 }
 return cnt == 1;
}
void construct_graph(std::string& beginWord, std::vector<std::string>& wordList, std::map<std::string, std::vector<std::string>>& graph)
{
 wordList.push_back(beginWord);
 for (int i = 0; i < wordList.size(); i++)
 {
  graph[wordList[i]] = std::vector<std::string>();
 }
 for (int i = 0; i < wordList.size(); i++)
 {
  for (int j = i+1; j < wordList.size(); j++)
  {
   if (connect(wordList[i], wordList[j]))
   {
    graph[wordList[i]].push_back(wordList[j]);
    graph[wordList[j]].push_back(wordList[i]);
   }
  }
 }
}
int BFS_graph(std::string& beginWord, std::string& endWord, std::map<std::string, std::vector<std::string>>& graph)
{
 std::queue<std::pair<std::string, int>> Q;
 std::set<std::string> visit;
 Q.push(std::make_pair(beginWord, 1));
 visit.insert(beginWord);
 while (!Q.empty())
 {
  std::string node = Q.front().first;
  int step = Q.front().second;
  Q.pop();
  if (node==endWord)
  {
   return step;
  }
  const std::vector<std::string>& neighbors = graph[node];
  for (int i = 0; i < neighbors.size(); i++)
  {
   if (visit.find(neighbors[i])==visit.end())
   {
    Q.push(std::make_pair(neighbors[i], step + 1));
    visit.insert(neighbors[i]);
   }
  }
 }
 return 0;
}
class Solution
{
public:
 Solution() {}
 ~Solution() {}
 int ladderLength(std::string beginWord, std::string endWord, std::vector<std::string>& wordList)
 {
  std::map<std::string, std::vector<std::string>> graph;
  construct_graph(beginWord, wordList, graph);
  return BFS_graph(beginWord, endWord, graph);
 }
};
int main()
{
 std::string beginWord = "hit";
 std::string endWord = "cog";
 std::vector<std::string> wordList;
 wordList.push_back("hot");
 wordList.push_back("dot");
 wordList.push_back("dog");
 wordList.push_back("log");
 wordList.push_back("cog");
 Solution solve;
 int result = solve.ladderLength(beginWord, endWord, wordList);
 printf("result = %d\n", result);
 return 0;
}

运行结果为:

result = 5
发布了90 篇原创文章 · 获赞 73 · 访问量 3619

猜你喜欢

转载自blog.csdn.net/weixin_44208324/article/details/105076640