代码随想录算法训练营Day59|110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长

字符串接龙

110. 字符串接龙 (kamacoder.com)

主要参考代码随想录 代码随想录 (programmercarl.com)

目标:得到从beginStr转变为endStr所需的最少步数

过程:每次变换一个字母,每次变换的结果要在strList中。

对于一个图来说,相当于我们有1个起点beginStr和一个终点endStr,以及strList中的N个字符串,然后我们需要找到路径来使得beginStr变成endStr,将beginStr连接到endStr的路径即为变化的过程,我们要最小化这个过程。

这里有两个问题:

  1. 图中的线是如何连在一起的。
  2. 如何确定当前路径最短。

对于线的连接,我们注意到每次只能变换一个字符,即我们需要判断是一个目标字符串与源字符串是否相差一个字符,若相差一个字符,则他们之间是连通的。

而判断路径最短,考虑使用广度优先算法,只要搜索到了结果,那得到的一定是最短路径,此外,注意这里计算的最短路径不是线的数目,而是节点的数目。

代码随想录里有两个点能方便计算:一是无向图需要标志位,来标记节点是否走过,使用set来检查字符串是否出现在字符串集合中较快。二是利用哈希表来映射字符串和路径长度。

具体代码如下,和代码随想录中结果一样。

#include <iostream>
#include <vector>
#include <string>
#include <unordered_set>
#include <unordered_map>
#include <queue>
using namespace std;int main(){int N;cin>>N;                  // 输入字符串数量 Nunordered_set<string> strSet;  // 创建一个无序集合存储所有字符串string beginStr, endStr, str;cin >> beginStr >>endStr;      // 输入起始字符串和目标字符串for(int i = 0; i < N; i++){cin>>str;                  // 输入 N 个字符串strSet.insert(str);        // 将字符串插入集合}unordered_map<string , int> visitMap; // 创建一个无序映射记录字符串和对应的路径长度queue<string> Queue;                 // 创建一个队列用于 BFSQueue.push(beginStr);                // 将起始字符串入队列visitMap.insert(pair<string,int>(beginStr, 1)); // 起始字符串路径长度为 1while(!Queue.empty()){               // 当队列不为空时进行 BFSstring word = Queue.front();     // 获取队列首部的字符串Queue.pop();int path = visitMap[word];       // 获取该字符串的路径长度for(int i = 0;i < word.size();i++){ // 遍历字符串的每个字符string newWord = word;       // 创建一个新字符串,用于修改字符for(int j = 0; j < 26; j++){ // 遍历 'a' 到 'z',ASCII码newWord[i] = 'a' + j;    // 修改字符串的一个字符if(newWord == endStr){   // 如果新字符串是目标字符串cout<<path + 1<<endl; // 输出路径长度并结束程序return 0;}if(strSet.find(newWord)!= strSet.end() && visitMap.find(newWord) == visitMap.end()){// 如果新字符串在集合中且未被访问过visitMap.insert(pair<string,int>(newWord,path + 1)); // 记录新字符串和路径长度Queue.push(newWord); // 将新字符串入队列}}}}cout<< 0 <<endl; // 如果没有找到路径,输出 0return 0;
}

对每个字符串,长度定位L,在BFS的过程中,每个字符串都可能被访问一次,每个源字符串的每个字符都有修改的可能,共有26*L次操作,由于每个字符串只被访问一次,因此总的时间复杂度为O(N*26*L)。

对空间复杂度,主要需要一个集合、一个哈希表及一个队列,空间复杂度都为O(N*L),总体空间复杂度为O(N*L)。

有向图的完全可达性

用广度优先搜索,对1的每个可达点进行遍历,并将可达点加入set,最后判断set的长度是否等于节点数即可。

#include <iostream>
#include <vector>
#include <unordered_set>
#include<queue>
using namespace std;int main(){int N,K;cin>>N>>K;                  // 输入节点总数 N 和边的总数 Kvector<vector<int>> dirgraph(K,vector<int>(2,0)); // 创建一个二维向量,用于存储有向图的边for(int i = 0 ; i < K; i++){cin>>dirgraph[i][0]>>dirgraph[i][1]; // 输入每条边的起始节点和终止节点}unordered_set<int> visited; // 创建一个无序集合,用于存储已访问的节点visited.insert(1);          // 将起始节点 1 加入已访问集合queue<int> Queue;           // 创建一个队列,用于 BFSQueue.push(1);              // 将起始节点 1 加入队列while(!Queue.empty()){       // 当队列不为空时进行 BFSint x = Queue.front();   // 获取队列首部的节点Queue.pop();             // 出队列for(int i = 0; i < K;i++){ // 遍历所有的边if(dirgraph[i][0] == x && visited.find(dirgraph[i][1]) == visited.end()) {// 如果边的起始节点是 x 并且终止节点未被访问过visited.insert(dirgraph[i][1]); // 将终止节点加入已访问集合Queue.push(dirgraph[i][1]);     // 将终止节点加入队列}}}if(visited.size()==N)        // 如果已访问的节点数等于总节点数cout<<1<<endl;else{                        // 否则cout<<-1<<endl;}return 0;
}

算法的时间复杂度为O(N*K),空间复杂度为O(N+K)。

岛屿的周长

emmm,想了半天dfs和bfs,发现并不需要。。。

代码随想录 (programmercarl.com)

遍历每一个空格,遇到岛屿就计算其上下左右的领域情况,若上下左右为0或超出区域,则是一条边。遍历完所有的空格和每个空格的领域,即得到结果。

#include <iostream>
#include <vector>
using namespace std;int result = 0;          // 定义一个全局变量,用于存储岛屿周长int main() {int N,M;cin>>N>>M;            // 输入网格的行数 N 和列数 Mvector<vector<int>> graph(N,vector<int>(M)); // 创建一个 N 行 M 列的二维向量,用于存储网格for(int i = 0; i < N; i++)                     // 遍历网格的每一行for (int j = 0; j < M; j++)                // 遍历网格的每一列cin >> graph[i][j];                    // 输入网格的值for(int i = 0; i < N; i++){                    // 遍历网格的每一行for(int j = 0; j < M; j++){                // 遍历网格的每一列if(graph[i][j] == 1){                  // 如果当前单元格是土地if((i + 1) == N || graph[i+1][j] == 0) // 如果下方是网格边缘或水result++;                       // 结果计数器加 1if((i - 1) == -1 || graph[i-1][j] == 0) // 如果上方是网格边缘或水result++;                       // 结果计数器加 1if(j + 1 == M || graph[i][j + 1] == 0) // 如果右方是网格边缘或水result++;                       // 结果计数器加 1if(j - 1 == -1 || graph[i][j - 1] == 0) // 如果左方是网格边缘或水result++;                       // 结果计数器加 1}}}cout<<result<<endl;  // 输出岛屿周长return 0;
}

算法的时间复杂度为O(4*N*M),空间复杂度为O(1)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

excel批量修改一列单价的金额并保留1位小数

1.打开表格&#xff0c;要把单价金额变成现在的两倍&#xff0c;数据如下&#xff1a; 2.把单价这一列粘贴到一个新的sheet页面&#xff0c;在B2单元格输入公式&#xff1a;A2*2 然后按enter回车键,这时候吧鼠标放到B2单元格右下角&#xff0c;会出现一个黑色的小加号&#xf…

重大更新来袭!!《植物大战僵尸杂交版V2.1+修改器+融合版》

大家好&#xff01;每个软件更新总是令人兴奋不已。前段时间介绍的《植物大战僵尸》系列以其独特的策略玩法和丰富的植物角色&#xff0c;赢得了很多玩家的喜爱。而在今天&#xff0c;这款经典游戏全网最新版本——《植物大战僵尸&#xff1a;杂交版V2.1》正式推出&#xff0c;…

docker 环境下failed to start lsb故障解决

背景&#xff1a;从深信服超融合迁移虚拟机到VMWARE集群后&#xff0c;迁移后的虚拟机 centos 7 运行systemctl start network ,报错 Restarting network (via systemctl): Job for network.service failed. See systemctl status network.service and journalctl -xn for d…

Redis组建哨兵模式

主172.17.60.131 从172.17.60.130、172.17.60.129 redis部署 [rootlocalhost app]# tar xf redis-6.2.9.tar.gz [rootlocalhost app]# cd redis-6.2.9/ [rootlocalhost redis-6.2.9]# make MALLOClibc [rootlocalhost redis-6.2.9]# make install PREFIX/usr/local/redis…

Docker 中查看及修改 Redis 容器密码的实用指南

在使用 Docker 部署 Redis 容器时&#xff0c;有时我们需要查看或修改 Redis 的密码。本文将详细介绍如何在 Docker 中查看和修改 Redis 容器的密码&#xff0c;帮助你更好地管理和维护你的 Redis 实例。 一、查看 Redis 容器密码 通常在启动 Redis 容器时&#xff0c;我们会…

构建LangChain应用程序的示例代码:56、如何实现一个多智能体模拟,其中没有固定的发言顺序。智能体自行决定谁来发言,通过竞价机制实现

多智能体分散式发言人选择 示例展示了如何实现一个多智能体模拟,其中没有固定的发言顺序。智能体自行决定谁来发言,通过竞价机制实现。 我们将在下面的示例中展示一场虚构的总统辩论来演示这一过程。 导入LangChain相关模块 from typing import Callable, Listimport tenac…

正向代理反向代理

nginx的正向代理和反向代理: 正向代理以及缓存配置: 代理:客户端不再是直接访问服务端&#xff0c;通过代理服务器访问服务端。 正向代理&#xff1a;面向客户端&#xff0c;通过代理服务器的ip地址访问目标服务端 服务端只知道代理服务器的地址&#xff0c;真正的客户端ip可以…

【MySQL系列】隐式转换

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ctfshow web入门 nodejs

web334 有个文件下载之后改后缀为zip加压就可以得到两个文件 一个文件类似于index.php 还有一个就是登录密码登录成功就有flag username:ctfshow password:123456因为 return name!CTFSHOW && item.username name.toUpperCase() && item.password passwor…

产科管理系统 专科电子病历系统源码,前后端分离架构,多家医院产科广泛运用,系统稳定,功能齐全

产科管理系统 专科电子病历系统源码&#xff0c;前后端分离架构&#xff0c;多家医院产科广泛运用&#xff0c;系统稳定&#xff0c;功能齐全 产科管理系统&#xff0c;特别是产科信息管理系统&#xff08;Obstetrical Information Management System&#xff0c;简称OIMS&…

智能井盖监测系统:守护城市安全的新防线

​ ​​在快速发展的现代都市中&#xff0c;井盖作为连接地上与地下世界的“隐形门”&#xff0c;其安全状态直接关系到市民的生命财产安全。随着物联网、大数据及人工智能技术的飞速发展&#xff0c;智能井盖监测系统的出现为解决传统井盖管理难题提供了创新方案&#xff0…

【算法笔记自学】入门篇(2)——算法初步

4.1排序 自己写的题解 #include <stdio.h> #include <stdlib.h>void selectSort(int A[], int n) {for(int i 0; i < n - 1; i) { // 修正索引范围int k i;for(int j i 1; j < n; j) { // 修正索引范围if(A[j] < A[k]) {k j;}}if (k ! i) { // 仅在…

跨境人最怕的封店要怎么规避?

跨境人最怕的是什么&#xff1f;——封店 造成封店的原因很多&#xff0c;IP关联、无版权售卖、虚假发货等等&#xff0c;其中IP关联这个问题导致店铺被封在跨境商家中简直是屡见不鲜 IP关联&#xff0c;是指被海外平台检测到多家店铺开设在同一个站点上的情况。我们知道有些…

卖家必读:阿里巴巴国际站登录与入驻全流程

阿里巴巴国际站作为全球最大的B2B电子商务平台之一&#xff0c;为品牌建立和业务拓展提供了可能。那么跨境卖家如何才能成功登录和入驻阿里巴巴国际站&#xff1f;本文将讲解如何用阿里巴巴国际站网页版进行登录&#xff0c;以及阿里巴巴国际站卖家的入驻条件、流程和费用。此外…

统计信号处理基础 习题解答11-12

题目 证明 的MAP估计量为 其中是一个的矢量, 是一个可逆的p*p的矩阵。也就是说&#xff0c;MAP估计量对可逆的线性变换是可以变换的。 解答 已知的联合概率密度 且&#xff1a; 现在知道&#xff1a; 那么为了获得变换后的MAP&#xff0c;首先需要根据求出 根据概率密度变换…

2024年软件测试面试题,精选100+,附答案+文档

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我…

C++入门 容器适配器 / stack queue模拟实现

目录 容器适配器 deque的原理介绍 stack模拟实现 queue模拟实现 priority_queue模拟实现 仿函数 容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总 结)&#xff0c;该种模式是将一个类的接口转换成客户希望…

深度学习Week19——学习残差网络和ResNet50V2算法

文章目录 深度学习Week18——学习残差网络和ResNet50V2算法 一、前言 二、我的环境 三、论文解读 3.1 预激活设计 3.2 残差单元结构 四、模型复现 4.1 Residual Block 4.2 堆叠Residual Block 4.3. ResNet50V2架构复现 一、前言 &#x1f368; 本文为&#x1f517;365天深度学…

Kubernetes k8s 命名空间 namespace 介绍以及应用 资源限额配置

目录 命名空间 什么是命名空间&#xff1f; namespace应用场景 namespacs使用案例分享 namespace资源限额 文档中的YAML文件配置直接复制粘贴可能存在格式错误&#xff0c;故实验中所需要的YAML文件以及本地包均打包至网盘 链接&#xff1a;https://pan.baidu.com/s/1qv8Tc…

Python中异步事件触发

1、问题背景 在Python中&#xff0c;我想创建一个由事件生成控制流程的类结构。为此&#xff0c;我做了以下工作&#xff1a; class MyEvent: EventName_FunctionName {}classmethoddef setup(cls, notificationname, functionname):if notificationname in MyEvent.EventN…