Problem: 127. 单词接龙
前言
好好好!又做出来一道困难题,逐渐在进步,莫西莫西!!!
预备知识
此题用到了广度优先搜索遍历,以及哈希表的运用。c++中哈希表是unordered_map。如果对此不了解的uu,建议查看相关介绍博客和更简单的题目!!!
解题思路
该题解法为:广度优先搜索遍历 + 哈希表的运用。
- 我们先用一个哈希集合去存储wordlist所有字符串,让之后的查询复杂度降为O(1)。
- 再次遍历wordlist,对每个s的下一个状态进行查询,复杂度为260,并且将每个s的下一个状态存储到一个哈希表mm(unordered_map<string, vector>)中,具有记忆化功能,之后查询为O(1)。
- 在ffdd查询s下一个状态的函数中主要遍历有以下功能:
比如s为hot,那么我选择遍历每个位置的26个字母的话最坏复杂度只有s.size() * 26,即10 * 26,但是我如果选择遍历wordlist中的话,就麻烦多了,首先是5000的长度,况且找到之后怎么确定是s的下一个状态,时间复杂度肯定不是O(1)。因此如果用一个哈希表记录wordlist,在用260的复杂度便可以找到s的下一个状态的所有字符串。
- 对于beginword,我单独进行了一次查找下一个状态的操作。
- 最后使用广度优先搜索进行所有下一个状态的处理与弹出,最多5000下一个状态。
复杂度
时间复杂度:
O(260 * n)
空间复杂度:
O(5000 * 3),只计算了mm,us,fd。
Code
class Solution {
public:
unordered_map<string, vector<string>> mm;
vector<string> ffdd(string& s, unordered_set<string>& us) {
vector<string> v;
//比如s为hot,那么我选择遍历每个位置的26个字母的话最坏复杂度只有s.size() * 26,即10 * 26,但是我如果选择遍历wordlist中的话,就麻烦多了,首先是5000的长度,况且找到之后怎么确定是s的下一个状态,时间复杂度肯定不是O(1)。因此如果用一个哈希表记录wordlist,在用260的复杂度便可以找到s的下一个状态的所有字符串。
for (int i = 0; i < s.size(); i++) {
//260
for (int j = 0; j < 26