力扣:127. 单词接龙 题解

Problem: 127. 单词接龙

前言

好好好!又做出来一道困难题,逐渐在进步,莫西莫西!!!

预备知识

image.png

此题用到了广度优先搜索遍历,以及哈希表的运用。c++中哈希表是unordered_map。如果对此不了解的uu,建议查看相关介绍博客和更简单的题目!!!

解题思路

该题解法为:广度优先搜索遍历 + 哈希表的运用。

  1. 我们先用一个哈希集合去存储wordlist所有字符串,让之后的查询复杂度降为O(1)。
    image.png
  2. 再次遍历wordlist,对每个s的下一个状态进行查询,复杂度为260,并且将每个s的下一个状态存储到一个哈希表mm(unordered_map<string, vector>)中,具有记忆化功能,之后查询为O(1)。
    image.png
  3. 在ffdd查询s下一个状态的函数中主要遍历有以下功能:
    比如s为hot,那么我选择遍历每个位置的26个字母的话最坏复杂度只有s.size() * 26,即10 * 26,但是我如果选择遍历wordlist中的话,就麻烦多了,首先是5000的长度,况且找到之后怎么确定是s的下一个状态,时间复杂度肯定不是O(1)。因此如果用一个哈希表记录wordlist,在用260的复杂度便可以找到s的下一个状态的所有字符串。
    image.png
  4. 对于beginword,我单独进行了一次查找下一个状态的操作。
    image.png
  5. 最后使用广度优先搜索进行所有下一个状态的处理与弹出,最多5000下一个状态。
    image.png

复杂度

时间复杂度:

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值