ManyRepalcement

news/2025/1/23 15:12:56/文章来源:https://www.cnblogs.com/Buy-iPhone/p/18687078

思路

本题要求对字符串进行操作。将字符串中所有指定的字母全部替换为另一个字母
传统方法是依次遍历这个字符串,当遇到需要被替换的字母c就将其更改为d
这种方法的时间复杂度是O(N*Q)
为了能更高效的更改,我想到的是能够尽快的将所有位置的信息一步更新,而不是遍历这个字符串来更新。如果能将同一字母的不同位置同时修改为指定的字母就可以大大提高更改的效率
因此我通过并查集,将同一字母不同位置分布视为等效类,并且通过两个一维数组分别记录字母d对应等效类,和某一个等效类对应哪一个字母。

代码

#include<iostream>
using namespace std;
class uset{public:uset(int size):max_size(size+1){root=new int[max_size];parent=new int[max_size];for(int i=0;i<=size;++i) root[i]=parent[i]=1;}int uhead(int e){//找到祖宗是哪一个if(1==root[e]) return e;parent[e]=uhead(parent[e]);return parent[e];}int umerge(int i,int j){i=uhead(i),j=uhead(j);if(i==j) return i;root[i]=0;parent[j]+=parent[i];parent[i]=j;return j;}public:int*root,*parent;int max_size;
};
const int MAX=200001;
int ci_map[26];//下标代表字母,内容代表这个字母对应的等效类的uhead值
char ic_map[MAX];//某个数字对应的字母是哪个,如果数值范围会很大就会用map
int main(){int N,Q;char ch;char c,d;string s;cin>>N>>s>>Q;uset us(N);for(int i=1;i<=N;++i){if(ci_map[s[i-1]-'a']){us.umerge(i,ci_map[s[i-1]-'a']);}else{ic_map[i]=s[i-1];ci_map[s[i-1]-'a']=i;}}for(int i=1;i<=Q;++i){cin>>c>>d;if(c==d||0==ci_map[c-'a']) continue;if(ci_map[d-'a']){us.umerge(ci_map[c-'a'],ci_map[d-'a']);//将下标类合并为一个等效类//关于类“c"的数据都擦除ic_map[ci_map[c-'a']]=0;ci_map[c-'a']=0;}else{//没有类d就将类c改名为类dint x=ci_map[c-'a'];ci_map[c-'a']=0;ic_map[x]=d;ci_map[d-'a']=x;}}for(int i=1;i<=N;++i){cout<<ic_map[us.uhead(i)];}return 0;
}

学习总结

完成代码对我来说具有挑战的就是能够更新等效类对应字母,和字母对应等效类的状态更新的过程。我起初尝试拓展并查集的功能,在并查集的合并操作中同时更新ci_map和ic_map,但是实在太过凌乱,反倒是并查集的合并功能搞得漏洞百出。
于是想到合并一个等效类和更新这个等效类对应的字母两者之间并没有必然的联系,我完全可以不扩展并查集的合并操作,而是单独将更新状态拿出来写。最终这样,才将ci_map和ic_map的状态更新写清楚。
本题的另一种思路是只需要考虑每个字母最终被替换为了哪个字母即可,并不需要搞清楚字符串中间究竟变成了什么。也就是设置一个长度为26的一维数组用来表示26个小写字母,中间的replacement操作来更改对应位置的字母的值,这样就可以最快的更新得到最终字母c被替换成了哪一个字母d

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

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

相关文章

java基础Day6 java数组

一、数组的定义 二、数组的声明和创建 dataType[] arrayRefVar;//首选方法 dataType arrayRefVar[];//效果相同,但不是首选方法int[] nums;//声明一个数组nums = new int[10];//创建一个数组//给数组元素赋值 nums[0] = 1; nums[1] = 2; nums[2] = 3; nums[3] = 4; nums[4] = …

windows服务管理

windows服务管理在 Windows 系统中,有多种方法可以管理服务。以下是一些常用的服务管理方法: 1. 服务控制管理器 (SCM) 服务控制管理器是一个系统级别的工具,用于启动、停止、暂停和恢复服务。它可以通过以下方式访问:运行命令:在“运行”对话框(快捷键 Win + R)中输入 …

深入探讨存储过程的创建与应用:提高数据库管理效率的关键工具

title: 深入探讨存储过程的创建与应用:提高数据库管理效率的关键工具 date: 2025/1/23 updated: 2025/1/23 author: cmdragon excerpt: 在数据驱动的商业环境中,数据库管理系统必须具备高效的操作能力。而存储过程作为一种封装的数据库逻辑,提供了一种有效的解决方案,以增…

大模型论文精选||多智能体微调:通过多样推理链实现自我提升

多智能体微调是一种实现自我提升的补充方法,它将微调应用于语言模型的多智能体群体。一组均基于相同基础模多智能体微调是一种实现自我提升的补充方法,它将微调应用于语言模型的多智能体群体。一组均基于相同基础模型的语言模型,通过模型间的多智能体交互生成的数据,分别对…

LWIP UDP使用

MCU: 小华HC32F4A0 板子没有合适的接口作为串口输出了,调试有点困难,想了个办法把lwip的UDP重定向到fputc函数 代码参考:https://www.cnblogs.com/54zorb/p/9609021.html UDP相关代码 /********************************* UDP测试 ************************************/ /*…

大模型论文精选|| 多 LLM 文本摘要:创新方法与卓越成果

多LLM文本摘要:创新方法与卓越成果 论文 https://arxiv.org/abs/2412.1多LLM文本摘要:创新方法与卓越成果论文 https://arxiv.org/abs/2412.15487 Multi-LLM Text Summarization 2412.15487 多LLM摘要框架在每一轮对话中有两个至关重要的步骤:生成和评估。根据使用的是多LLM…

国产化板卡设计原理图:2018-基于双FT-M6678 DSP的3U VPX的信号处理平台

基于双FT-M6678 DSP的3U VPX的信号处理平台一、板卡概述该板卡是由我公司自主研发的基于3U VPX架构的信号处理板,该处理板包含2片 FT-M6678 DSP芯片,1片 Spartan-3系列XC3S200AN配置芯片,两片DSP分别有1路RapidIO x4连接至VPX背板,两片DSP之间通过Hyperlink x4和SGMII互联。…

国产化板卡设计原理图:2288-基于FMC接口的JFM7K325T PCIeX4 3U VPX接口卡

基于FMC接口的JFM7K325T PCIeX4 3U VPX接口卡 一、板卡概述 标准VPX 3U板卡, 基于JFM7K325T 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8、64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持各种接口输入,软件支持windows,Linux驱动。可应用于高性能计算,频域算…

vue template 转 jsx 写法及TS类型应用

vue 的响应式数据 + jsx 开发体验简直不要太好,心智负担确实小,简直完爆 react(纯属个人暴论),不足的地方就是生态了,这点确实比不过 react。 本文更侧重于 TS 类型的写法,毕竟初次接触 vue jsx 时,实在对其 TS 类型声明很不顺手。要说 vue 模板语法哪些 API 不能在 js…

团队任务分配与高效执行应该如何做?从这些方面合理调配

本文聚焦团队任务分配与高效执行,深度剖析团队协作中任务分配不合理、沟通协作障碍、目标不明确、缺乏有效监督反馈等痛难点,阐述团队协作的必要性,进而给出合理分配任务、加强沟通协作等解决方法,还推荐了相关工具,为提升团队效能提供指引 。一、团队协作的痛难点 (一)…

2025.1.23

今天正式开始YOLOv8的相关学习。 YOLOv8的架构设计主要体现在以下几个方面:1. 改进的特征提取网络    YOLOv8在特征提取网络方面进行了显著改进,采用了更深、更宽的网络结构,以提高对复杂场景的处理能力。CSPNet(Cross Stage Partial Network):    CSPNet的引入有…

Android平台从上到下,无需ROOT/解锁/刷机,应用级拦截框架的最后一环,SVC系统调用拦截。

Android平台从上到下,无需ROOT/解锁/刷机,应用级拦截框架的最后一环,SVC系统调用拦截。Android平台从上到下,无需ROOT/解锁/刷机,应用级拦截框架的最后一环 —— SVC系统调用拦截。☞ Github: https://www.github.com/iofomo/abyss ☜ 由于我们虚拟化产品的需求,需要支持…