Problem: 127. 单词接龙
思路
先连接成图,将只相差一个词的单词连接在一起,我们将beginWord
加入到wordlist
,这样方便beginWord
加入图中,这里的图我们用unordered_map<int, vector<int>> edge;
保存,一个顶点可以连接多个顶点。
需要注意的是,这里map
里面的vector<int>
居然不用我们初始化,他是自动就有的。
同时可以查询end
在不在wordlist
里面,不在的话直接返回0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| for (int i = 0; i < wordList.size(); i++) { if (wordList[i] == endWord) { endIndex = i; noEnd = false; } for (int j = 0; j < wordList.size(); j++) { if (i == j) continue; int differ = 0; for (int k = 0; k < beginWord.size(); k++) { if (wordList[i][k] != wordList[j][k]) differ++; } if (differ == 1) { edge[i].push_back(j); } } }
|
然后将连接好的图进行广度优先搜索,这里需要保存我们搜到的节点的路径长度,用
vector<int> dis(wordList.size(), INT_MAX)
保存,注意我们的开始阶段的dis[beginIndex] = 0
要初始化为0,
这里最重要的就是记录路径,我们对每一个节点都记录搜索到他的路径。
同时根据这个路径我们也可以判断有没有搜索过他。
最后返回条件: 搜索到了endIndex
,返回dis[endIndex] + 1
,因为第一个头我们没有算,我们是从0开始的所以要加一。
1 2 3 4
| if (dis[neigbor] == INT_MAX) { dis[neigbor] = dis[item] + 1; que.push(neigbor); }
|
Code
[]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| class Solution { public: int bfs(vector<string>& wordList, unordered_map<int, vector<int>> edge, int beginIndex, int endIndex) { queue<int> que; que.push(beginIndex); vector<int> dis(wordList.size(), INT_MAX); dis[beginIndex] = 0; while (!que.empty()) { int item = que.front(); que.pop(); if (item == endIndex) return dis[endIndex] + 1; for (auto& neigbor : edge[item]) { if (dis[neigbor] == INT_MAX) { dis[neigbor] = dis[item] + 1; que.push(neigbor); } } } return 0; }
int ladderLength(string beginWord, string endWord,vector<string>& wordList) { unordered_map<int, vector<int>> edge; wordList.push_back(beginWord); int beginIndex = wordList.size() - 1; int endIndex = 0; bool noEnd = true; for (int i = 0; i < wordList.size(); i++) { if (wordList[i] == endWord) { endIndex = i; noEnd = false; } for (int j = 0; j < wordList.size(); j++) { if (i == j) continue; int differ = 0; for (int k = 0; k < beginWord.size(); k++) { if (wordList[i][k] != wordList[j][k]) differ++; } if (differ == 1) { edge[i].push_back(j); } } }
if (noEnd) return 0;
return bfs(wordList, edge, beginIndex, endIndex); } };
|