赞
踩
字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk:
每一对相邻的单词只差一个字母。
对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
sk == endWord
给你两个单词 beginWord 和 endWord 和一个字典 wordList ,返回 从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0 。
示例 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" 不在字典中,所以无法进行转换。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-ladder
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- class Solution {
- public:
- unordered_map<string, int> wordId;
- vector<vector<int>> edge;
- int nodeNum = 0;
-
- void addWord(string& word) {
- if (!wordId.count(word)) {
- wordId[word] = nodeNum++;
- edge.emplace_back();
- }
- }
-
- void addEdge(string& word) {
- addWord(word);
- int id1 = wordId[word];
- for (char& it : word) {
- char tmp = it;
- it = '*';
- addWord(word);
- int id2 = wordId[word];
- edge[id1].push_back(id2);
- edge[id2].push_back(id1);
- it = tmp;
- }
- }
-
- int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
- for (string& word : wordList) {
- addEdge(word);
- }
- addEdge(beginWord);
- if (!wordId.count(endWord)) {
- return 0;
- }
- vector<int> dis(nodeNum, INT_MAX);
- int beginId = wordId[beginWord], endId = wordId[endWord];
- dis[beginId] = 0;
-
- queue<int> que;
- que.push(beginId);
- while (!que.empty()) {
- int x = que.front();
- que.pop();
- if (x == endId) {
- return dis[endId] / 2 + 1;
- }
- for (int& it : edge[x]) {
- if (dis[it] == INT_MAX) {
- dis[it] = dis[x] + 1;
- que.push(it);
- }
- }
- }
- return 0;
- }
- };
-
- 作者:LeetCode-Solution
- 链接:https://leetcode-cn.com/problems/word-ladder/solution/dan-ci-jie-long-by-leetcode-solution/
- 来源:力扣(LeetCode)
- 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。