代码随想录算法训练营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.rhkb.cn/news/369312.html

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

相关文章

【YOLOv5/v7改进系列】改进池化层为ASPP

一、导言 Atrous Spatial Pyramid Pooling (ASPP)模块是一种用于多尺度特征提取的创新技术&#xff0c;旨在提升深度学习模型在语义图像分割任务中的表现。ASPP模块通过在不同的采样率下应用空洞卷积&#xff0c;可以捕获不同大小的对象以及图像的上下文信息&#xff0c;从而增…

Astro新前端框架首次体验

Astro新前端框架首次体验 1、什么是Astro Astro是一个静态网站生成器的前端框架&#xff0c;它提供了一种新的开发方式和更好的性能体验&#xff0c;帮助开发者更快速地构建现代化的网站和应用程序。 简单来说就是&#xff1a;Astro这个是一个网站生成器&#xff0c;可以直接…

Hyper-V克隆虚拟机教程分享!

方法1. 使用导出导入功能克隆Hyper-V虚拟机 导出和导入是Hyper-V服务器备份和克隆的一种比较有效的方法。使用此功能&#xff0c;您可以创建Hyper-V虚拟机模板&#xff0c;其中包括软件、VM CPU、RAM和其他设备的配置&#xff0c;这有助于在Hyper-V中快速部署多个虚拟机。 在…

前端引用vue/element/echarts资源等引用方法Blob下载HTML

前端引用下载vue/element/echarts资源等引用方法 功能需求 需求是在HTML页面中集成Vue.js、Element Plus&#xff08;Element UI的Vue 3版本&#xff09;、ECharts等前端资源&#xff0c;使用Blob下载HTML。 解决方案概述 直接访问线上CDN地址&#xff1a;简单直接&#xff0c…

计算机网络(2

计算机网络续 一. 网络编程 网络编程, 指网络上的主机, 通过不同的进程, 以编程的方式实现网络通信(或网络数据传输). 即便是同一个主机, 只要不同进程, 基于网络来传输数据, 也属于网络编程. 二. 网络编程套接字(socket) socket: 操作系统提供的网络编程的 API 称作 “soc…

【数据结构与算法】堆排序算法原理与实现:基于堆实现的高效排序算法

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​ 目录 一、引言 堆排序的简介 堆排序的特点 二、堆的概念 三、堆排序算法的原理 四、堆…

软件测试面试1000问(含答案)

1、自动化代码中,用到了哪些设计模式? 单例设计模式工厂模式PO设计模式数据驱动模式面向接口编程设计模式 2、什么是断言( Assert) ? 断言Assert用于在代码中验证实际结果是不是符合预期结果&#xff0c;如果测试用例执行失败会抛出异常并提供断言日志 3、什么是web自动化…

数据结构预科

在堆区申请两个长度为32的空间&#xff0c;实现两个字符串的比较【非库函数实现】 要求&#xff1a; 1> 定义函数&#xff0c;在对区申请空间&#xff0c;两个申请&#xff0c;主函数需要调用2次 2> 定义函数&#xff0c;实现字符串的输入&#xff0c;void input(char …

Jenkins容器的部署

本文主要是记录如何在Centos7上安装docker,以及在docker里面配置tomcat、mysql、jenkins等环境。 一、安装docker 1.1 准备工作 centos7、VMware17Pro 1.2 通过yum在线安装dokcer yum -y install docker1.3 启动docker服务 systemctl start docker.service1.4 查看docke…

Java传引用问题

本文将介绍 Java 中的引用传递&#xff0c;包括其定义、实现方式、通过引用修改原来指向的内容和通过引用修改当前引用的指向的区别 目录 1、引用传递的概念 2、引用传递的实现方式 3、传引用会发生的两种情况&#xff1a; 通过引用修改当前引用的指向 通过引用修改原来指…

《数据仓库与数据挖掘》 总复习

试卷组成 第一章图 第二章图 第三章图 第四章图 第五章图 第六章图 第九章图 第一章 DW与DM概述 &#xff08;特点、特性&#xff09; DB到DW 主要特征 &#xff08;1&#xff09;数据太多&#xff0c;信息贫乏&#xff08;Data Rich&#xff0c; Information Poor)。 &a…

H2 Database Console未授权访问漏洞封堵

背景 H2 Database Console未授权访问&#xff0c;默认情况下自动创建不存在的数据库&#xff0c;从而导致未授权访问。各种未授权访问的教程&#xff0c;但是它怎么封堵呢&#xff1f; -ifExists 很简单&#xff0c;启动参数添加 -ifExists &#xff0c;它的含义&#xff1a…

【机器学习】机器学习的重要方法——线性回归算法深度探索与未来展望

欢迎来到 破晓的历程博客 引言 在数据科学日益重要的今天&#xff0c;线性回归算法以其简单、直观和强大的预测能力&#xff0c;成为了众多领域中的基础工具。本文将详细介绍线性回归的基本概念、核心算法&#xff0c;并通过五个具体的使用示例来展示其应用&#xff0c;同时探…

CASS7.0按方向和距离绘制图形

1、绘制工具 2、按方向和距离绘制 &#xff08;1&#xff09;切换方向 &#xff08;2&#xff09;距离输入

Python函数缺省参数的 “ 坑 ” (与C++对比学习)

我们都知道Python函数的缺省参数可以降低我们调用函数的成本&#xff0c;但是一般我们的缺省参数都是不可变对象&#xff0c;如果是可变对象&#xff0c;我们对其多次调用会发生什么呢&#xff1f; def func(arr[]):arr.append(Hello)print(arr)func() func() func() 这貌似…

MongoDB-社区版-本地安装

系统&#xff1a;win10 1. 下载server:Download MongoDB Community Server | MongoDB 我选的zip包 2. 下载shell&#xff1a;MongoDB Shell Download | MongoDB 我选的zip包 3. 启动server 4. 启动shell, 完成

MYSQL函数进阶详解:案例解析(第19天)

系列文章目录 一、MySQL的函数&#xff08;重点&#xff09; 二、MySQL的窗口函数&#xff08;重点&#xff09; 三、MySQL的视图&#xff08;熟悉&#xff09; 四、MySQL的事务&#xff08;熟悉&#xff09; 文章目录 系列文章目录前言一、MySQL的函数1. 聚合函数2. group_c…

Redis 多数据源自定义配置 Spring Boot 升级版

文章目录 1.前言2.git 示例地址3.需求4.代码实现4.1 application.properties 配置文件4.2 获取 application.properties 中的 redis 配置4.2.1 Environment 对象来获取自定义 redis 配置 4.3 初始化 RedisTemplate 对象&#xff0c;并注册到 Spring IOC 容器4.3.1 初始化方法4.…

spring boot (shiro)+ websocket测试连接不上的简单检测处理

1、用前端连接测试的demo一切正常&#xff0c;但是到了项目中连接不上了 一开始以为是地址错&#xff0c;但是换了apifox测试也是不可以。 2、考虑是shiro进行了拦截了&#xff0c;所以就访问不到了地址&#xff0c;那么就放行。 3、再次用apifox测试&#xff0c;成功了。 当然…

马拉松报名小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;赛事信息管理&#xff0c;赛事报名管理&#xff0c;活动商城管理&#xff0c;留言板管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;赛事信息&…