LeetCode-----第127题-----单词接龙

单词接龙

难度:中等

给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:

  1. 每次转换只能改变一个字母。
  2. 转换过程中的中间单词必须是字典中的单词。

说明:

  • 如果不存在这样的转换序列,返回 0。
  • 所有单词具有相同的长度。
  • 所有单词只由小写字母组成。
  • 字典中不存在重复的单词。
  • 你可以假设 beginWord 和 endWord 是非空的,且二者不相同。

示例 1:

输入:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]

输出: 5

解释: 一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog",
     返回它的长度 5。

示例 2:

输入:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]

输出: 0

解释: endWord "cog" 不在字典中,所以无法进行转换。

 

题目分析:

       本题主要考察点为图论,使用BFS进行解题。图论的题涉及到图的构建(邻接矩阵),图的遍历。首先构建邻接矩阵,本题采用unordered_map,所表达的是一个字符串对应多个字符串,将和当前字符只相差一个字符的作为邻居,由于本题是无向图,所以要进行双向连接。在申请一个set作为记录是否遍历过的flag。建立完邻接矩阵之后,进行BFS搜索,一层一层搜索,看有没有endworld,没有的话返回0,存在的话,返回层数。

 

参考代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
#include
#include 
#include 

using namespace std;

class Solution {
public:
    //检查两个字符串不一样的字符个数
	bool check(const string& str1, const string& str2)
	{
		int diff = 0;
		for (int i = 0; i < str1.size(); i++)
		{
			if (str1[i] != str2[i])
				diff++;
			if (diff > 1)
				return false;
		}
		return diff == 1;
	}
    //构建图
	void construct_graph(string &beginWord, vector &wordList, unordered_map > &graph)
	{
		wordList.push_back(beginWord);
		for (int i = 0; i& wordList)
	{
		unordered_map> graph;//图变量
		construct_graph(beginWord, wordList, graph);//构建图
		queue str_q; //BFS 辅助队列
		unordered_set visit_set; //图不像树一样,它是会遍历到重复节点的

		str_q.push(beginWord);
		visit_set.insert(beginWord);
		int result = 1;
        //BFS的标准写法
		while (!str_q.empty())
		{
			int size = str_q.size();
            //遍历当前层
			for (int i = 0; i < size; i++)
			{
				string move = str_q.front();
				str_q.pop();

				vector neighbor = graph[move];
                //遍历当前层每一个顶点的邻居
				for (int j = 0; j < neighbor.size(); j++)
				{
                    //如果没有找到的话,把当前节点的邻居压入队列
					if (visit_set.find(neighbor[j]) == visit_set.end())
					{
						str_q.push(neighbor[j]);
						visit_set.insert(neighbor[j]);
					}
                    //找到的话就返回层数
					if (neighbor[j] == endWord) return result + 1;
				}
			}
			result++;
		}
		return 0;
	}
};

int main()
{
	Solution solution;
	string beginWord = "hit";
	string endWord = "cog";
	vector wordList = { "hot", "dot", "dog", "lot", "log", "cog" };
	cout << solution.ladderLength(beginWord, endWord, wordList) << endl;
	
	system("pause");
	return 0;
}

 

你可能感兴趣的:(LeetCode-----第127题-----单词接龙)