127. 单词接龙
时间:2020年11月5日
知识点:广搜、队列、字符串
题目链接:https://leetcode-cn.com/problems/word-ladder/
题目
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:
- 每次转换只能改变一个字母。
- 转换过程中的中间单词必须是字典中的单词。
说明:
- 如果不存在这样的转换序列,返回 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” 不在字典中,所以无法进行转换。
解法:
- 建立string to int 的映射 注意除了wordList里的字符串 beginWord也要转换
- 同时 建立int to string 的映射 为了建立边 注意beginWord
- 如果endword没有出现在 能够转换的字符串中 返回0
- 重新构建边数组的大小 建立边 如果两个字符串 通过一次变化 就可以达到 建边
- 类似于距离的更新函数 beginWord对应的位置数组中 初始化为1
- 建立队列 如果从这个字符串能到 其他字符串 更新距离 放入队列
- 直到队列取出的 对应string 为endString
代码
#include <stdio.h>
#include <iostream>
#include <vector>
#include <unordered_map>
#include <cstring>
#include <queue>
using namespace std;
class Solution {
public:
unordered_map<string, int> wordToId;
vector<string> idToWord;
vector<vector<int>> edges;
int num = 0;
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
//string 转换成 int类型 存到hash表中
idToWord.resize(wordList.size()+1);
for(int i = 0;i < wordList.size();i++){
string str = wordList[i];
if(!wordToId.count(str))
wordToId[str] = num++;
idToWord[i] = str;
}
idToWord[num] = beginWord;
wordToId[beginWord] = num++;
edges.resize(num);
if(!wordToId.count(endWord))
return 0;
for (int i = 0; i < idToWord.size(); i++) {
for (int j = i + 1; j < idToWord.size(); j++) {
if (checkEdge(idToWord[i], idToWord[j])) {
edges[i].push_back(j);
edges[j].push_back(i);
}
}
}
vector<int> dis(num,INT_MAX);
int beginId = wordToId[beginWord],endId = wordToId[endWord];
dis[beginId] = 1;
queue<int> q;
q.push(beginId);
while(!q.empty()){
int tmp = q.front();
q.pop();
if(tmp == endId)
return dis[endId];
for(int i = 0;i < edges[tmp].size();i++){
if(dis[edges[tmp][i]] > dis[tmp] +1){
dis[edges[tmp][i]] = dis[tmp]+1;
q.push(edges[tmp][i]);
}
}
}
return 0;
}
bool checkEdge(string& str1,string& str2) {
int diff = 0;
for (int i = 0; i < str1.size() && diff < 2; i++) {
if (str1[i] != str2[i]) {
diff++;
}
}
return diff == 1;
}
};
int main()
{
string beginWord = "hit";
string endWord = "cog";
vector<string> wordList {"hot","dot","dog","lot","log","cog"};
Solution s;
cout<<s.ladderLength(beginWord, endWord, wordList)<<endl;
return 0;
}
今天也是爱zz的一天哦!