IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode——126. 单词接龙 II -> 正文阅读

[数据结构与算法]LeetCode——126. 单词接龙 II

概述

题目地址

  • 题目不难理解,这里不需要额外解释

思路

  • 首先 题目要求寻找最短转换序列,那么我们容易想到使用BFS

    BFS思路这里不再介绍

  • 沿着BFS考虑代码编写,问题在于如何正确保存获取目标单词的路径,有以下问题:
    • BFS利用队列,每次遍历一个level,获得的是每层可以访问的结点,并不是我们需要的路径
  • 所以,BFS每次获得合法结点时,应该保存该结点及到达该结点的路径(即之前访问的结点序列)
    • 但是注意的是,BFS每次遍历一层,可能会导致有多条路径出现
    • 那么在遍历下一层时,应该对上一层产生的每条路径都需要分析才行

分析

  • 如何确定结点访问的下一个合法结点?
    • 一种思路是通过遍历wordlist,比较和结点之间的差异,如果只有一字母不想同,则是合法结点
    • 令一种思路是从原结点出发,遍历它的所有可以通过一位变化产生的单词,判断是否在wordlist;
      如果在的话,则是合法结点

      实际上,根据数据限制,单词表最多有5000个,而单词长度5*26=100,所以第2种时间更少
      当然,为了加速判断操作,可以选择哈希表来保存原wordlist

  • 如何保存每次路径?
    • 因为每层访问可能产生多条路径,所以选择以下数据结构保存路径
    queue<vector<string> path;
    

代码

class Solution {
public:

    vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) {

        vector<vector<string>> last_res;        // 保存最终结果

        unordered_map<string,int> search;       // 哈希保存wordlist
        for(auto s : wordList)
            search[s] = 1;

        queue<vector<string>> res;      // 保存每层遍历后产生的队列
        res.push({beginWord});          // 开始只有一条队列,从beginword开始

        int found = 0;      // 只要在某层找到endword,就不需进行后面的层查找

        while(!res.empty()) {

            int size_path = res.size();                 // 有几条路径
            unordered_set<string> visited_temp;     // 记录当前层的访问结点

            for (int i = size_path; i > 0; --i) {       // 每条结点都要访问下层结点
                auto path = res.front(); res.pop();     // 取出一条路径
                string path_last = path.back();         // 路径最后一个结点

                // 对该路径向下探索
                for (int j = 0; j < path_last.size(); ++j) {
                    char temp = path_last[j];
                    for (char c = 'a'; c <= 'z'; ++c){
                        if (temp == c)  continue;       // 自己本身跳过
                        path_last[j] = c;

                        if (!search[path_last])   continue; 	// 如果该结点之前访问过,也跳过

                        visited_temp.emplace(path_last);        // 保存该层访问过结点
                        // 这里注意,同一层是可以访问相同结点的,因为路径不同
                        // 所以,在同一层访问结点时,不能直接将访问的结点加入search

                        path.push_back(path_last);      // 保存最新的路径
                        if(path_last == endWord){       // 如果找到endword
                            found = 1;						// 记录
                            last_res.push_back(path);      // 将路径加入结果
                        } else 
                            res.push(path);

                        path.pop_back();        // 回溯
                    }
                    path_last[j] = temp;        // 回溯path_last,继续找下个合法结点
                }
            } 
            for (auto &p : visited_temp)       // 将该层所有访问的结点加入
                search[p] = 0;
            if (found) break;
        }  
        return last_res;
    }
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:36:03  更:2022-04-04 12:39:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:39:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码