单词接龙-双向广搜

news/2024/9/22 22:11:21

单词接龙

题目链接

LeetCode单词接龙

题意概述

  1. 字典 \(wordList\) 中从单词 \(beginWord\)\(endWord\) 的 转换序列 是一个按下述规格形成的序列 \(beginWord -> s_1 -> s_2 -> ... -> s_k:\)

  2. 每一对相邻的单词只差一个字母。
    对于 \(1 <= i <= k\) 时,每个 \(si\) 都在 \(wordList\) 中。注意, \(beginWord\) 不需要在 \(wordList\) 中。

  3. \(s_k = endWord\)

  4. 给你两个单词 \(beginWord\)\(endWord\) 和一个字典 \(wordList\) ,返回 从 \(beginWord\)\(endWord\) 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 \(0\)

思路

  1. 每个单词只能向与它差异一个字母的单词转换,可以把一个单词和它能转换的单词连一条边,那么这道题就是一个最短路的问题

  2. 考虑\(bfs\),对于一单词,把它能转化的单词加入队列中(这里的能转化指的是既与该单词相差一个字母,又在wodlist中),直到遇到目标单词,根据\(bfs\)的特性,此时一定是最短路径

  3. 过程中可以使用哈希表与字符串形成映射

  4. 时间复杂度分析:

    • \(wordlist\)中有\(n\)个元素,单词长度为\(n\)
    • 考虑最坏情况:每个单词每一位都被替换过一次,每个单词有\(26\times len\)种替换的结果,假如答案是\(ans\),那么最后的时间复杂度是要大于\(O(len^{ans})\)
  5. 代码

#include <bits/stdc++.h>std::string begin, end;
int n = 0;
const int maxn = 1e5 + 5;
std::unordered_map<std::string, int> wordList;
std::unordered_map<std::string, int> mp;
std::unordered_map<int, std::string> st;
std::queue<int> que;
int dis[maxn];
int cnt = -1;
void bfs()
{que.push(++cnt);mp[begin] = cnt;st[cnt] = begin;dis[cnt] = 0;while(!que.empty()){int tmp = que.front();que.pop();std::string cur = st[tmp];for (int i = 0; i < (int)cur.length(); i++){for (int j = 0; j <= 25; j++){std::string nxt = cur;char ch = (char)('a' + j);if (ch == nxt[i]) continue;nxt[i] = ch;if (wordList[nxt] != 0 && mp[nxt] == 0){std::cout << nxt << '\n';que.push(++cnt);mp[nxt] = cnt;st[cnt] = nxt;dis[cnt] = dis[mp[cur]] + 1;if (nxt == end){std::cout << dis[cnt] + 1;return;}}}}}std::cout << 0;
}signed main()
{//freopen("in.txt", "r", stdin);std::ios::sync_with_stdio(false);std::cin.tie(nullptr), std::cout.tie(nullptr);std::cin >> begin >> end >> n;std::string str;memset(dis, -1, sizeof(dis));for (int i = 1; i <= n; i++){std::cin >> str;wordList[str] = 1;}if (wordList[end] == 0){std::cout << 0;return 0;}bfs();return 0;
}
  1. 优化
    • \(bfs\)搜索的节点数是以指数级增长的,所以数据一大就爆了、
    • 考虑从起点和终点开始双向搜索
    • 这样复杂度其实没有变,但是比单向搜索快了不少
  2. 优化代码
#include <bits/stdc++.h>
std::string begin, end;
const int maxn = 1e5 + 5;
std::unordered_map<std::string, int> wordList;
std::unordered_map<std::string, int> mp;
std::unordered_map<int, std::string> st;
std::queue<int> queA, queB;
int disA[maxn], disB[maxn];
int cnt = -1, n = 0;int extend(int judge, std::queue<int> &que, int dis[])
{int ans = 0x7f7f7f7f;int len = que.size();for (int l = 0; l < len; l++){int tmp = que.front();que.pop();std::string cur = st[tmp];for (int i = 0; i < (int)cur.length(); i++){std::string nxt = cur;for (int j = 0; j < 26; j++){char ch = (char)('a' + j);if (ch == nxt[i]) continue;nxt[i] = ch;if (wordList[nxt] == 0) continue;if (mp[nxt] == 0){mp[nxt] = ++cnt;st[cnt] = nxt;dis[cnt] = dis[mp[cur]] + 1;que.push(cnt);//std::cout << judge << " " << nxt << '\n';}else{if (judge == 0 && disA[mp[nxt]] != 0) continue;if (judge == 1 && disB[mp[nxt]] != 0) continue;if (judge == 0 && disB[mp[nxt] != 0]){//std::cout << nxt << '\n';ans = std::min(ans, disA[mp[cur]] + disB[mp[nxt]]);}if (judge == 1 && disA[mp[nxt]] != 0){//std::cout << nxt << '\n';ans = std::min(ans, disB[mp[cur]] + disA[mp[nxt]]);}}}}}if (ans != 0x7f7f7f7f) return ans;return 0;
}int bfs()
{queA.push(++cnt);mp[begin] = cnt, st[cnt] = begin, disA[cnt] = 1;queB.push(++cnt);mp[end] = cnt, st[cnt] = end, disB[cnt] = 1;while(queA.size() && queB.size()){int judge = 0, t = 0;if (queA.size() > queB.size()) // 搜B{judge = 1;t = extend(judge, queB, disB);}else // 搜A{judge = 0;t = extend(judge, queA, disA);}if (t != 0) return t;}return 0;
}void solve()
{std::cin >> begin >> end >> n;std::string str;for (int i = 1; i <= n; i++){std::cin >> str;wordList[str] = 1;}if (wordList[end] == 0){std::cout << 0;return;}std::cout << bfs();
}signed main()
{freopen("in.txt", "r", stdin);std::ios::sync_with_stdio(false);std::cin.tie(nullptr), std::cout.tie(nullptr);memset(disA, 0, sizeof(disA));memset(disB, 0, sizeof(disB));solve();return 0; 
}

示例

输入 
hit cog 6
hot dot dog lot log cog
输出
5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/63504.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 必知概念

Delete、Drop 和 Truncatedelete、truncate 仅仅删除表里面的数据,drop会把表的结构也删除 delete 是 DML 语句,操作完成后,可以回滚,truncate 和 drop 是 DDL 语句,删除之后立即生效,不能回滚 执行效率:drop > truncate > deleteMyISAM 与 InnoDBInnoDB 支持事务…

视野修炼-技术周刊第102期 | js 编译运行C

① Bun 现在允许直接在js中直接编译运行 C ! ② caniuse-cli ③ SSL证书管理工具 ④ 好的重构与坏的重构 ⑤ sisi - 命令行图片检索工具 ⑥ cvbee.ai - AI 简历生成欢迎来到第 102 期的【视野修炼 - 技术周刊】,下面是本期的精选内容简介 🔥强烈推荐Bun 现在允许直接在js中…

【vulhub】Discuz-命令执行 wooyun-2010-080723

【vulhub】Discuz-命令执行 wooyun-2010-080723 ​docker-compose up-d​启动! ​​ wooyun-2010-080723 命令执行 0x01 搭建环境 访问192.168.132.138:8080/install​,安装数据库。数据库服务器填写db(必须db,不然安装失败),数据库名为discuz,数据库账号密码均为root,…

2376.统计特殊整数

如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。 给你一个 正 整数 n ,请你返回区间 [1, n] 之间特殊整数的数目。 示例 1: 输入:n = 20 输出:19 解释:1 到 20 之间所有整数除了 11 以外都是特殊整数。所以总共有 19 个特殊整数。 示例 2: 输入:n = …

数业智能心大陆:职场倦怠的新解法

什么是职业倦怠? 在职场中,职业倦怠的表现形式丰富多样。从数业智能心大陆 AI 心理咨询平台的数据来看,职业倦怠呈现出多种状态。教师可能对教学不再满怀热情,精心备课也成为过去式;情绪上容易烦躁、易怒,在工作压力之下,常常因为一些小事就被激怒。比如在项目团队中,成…

2024“华为杯”数模研赛E数据提取代码

2024年数学建模研究生赛E题从视频中提取数据的代码。主要包括三个部分:车流量计算、各车道车流量计算和平均速度计算。主要讲述了代码的使用方法,包括需要修改的参数和文件路径,以及一些特殊情况的处理方法。同时还提供了参数估计和绘图的相关代码,以及如何根据不同视频视角…

用Eide下配合Cubemx配置stm32环境

PS:本篇为个人学习的记录,一是方便回忆,二是相同时方便给像我一样的小白一点建议。本文默认已安装好STM32Cubemx和VSCode,以及VsCode下的Eide Cubemx部分选择好需要使用的对应单片机创建工程。在Project Manager选项下 选择Toolchain/IDE下的makefile方式来创建工程。什么是…

USB2.0设备的休眠挂起及远程唤醒

USB可见设备状态,分为连接(Attached),上电(Powered),默认(Default),地址(Address),配置(Configured)和挂起(Suspended)6个状态。所谓可见,即USB系统和主机可见的状态,其他状态属于USB设备内部而不可见。其中有关电源的,大致可分下面三类:连接状态(Attached):设备连…