当前位置: 首页 > news >正文

【LeetCode】2785. 将字符串中的元音字母排序

题目描述

题目链接
在这里插入图片描述

问题分析

这道体的思路非常简单和好理解,找出字符串中的元音字符,然后按照ASSIC值进行排序,然后插入回对应的位置,解题步骤为:

  1. 使用一个set(可以快速查找的容器),建立元音字符集合
  2. 遍历整个字符串s,挨个匹配是否在set中,然后使用一个数组记录元音字符在字符串中的位置
  3. s中的对应位置的元素提取出来,按照ASSIC进行排序
  4. 挨个插入回字符串中

简单模拟的解法

class Solution {set<char> s_set={'A','E','I','O','U','a','e','i','o','u'};
public:string sortVowels(string s) {string S(s);//遍历字符串并查找元音字符的位置vector<int> v;for(int i=0;i<S.size();i++){if(s_set.find(S[i])!=s_set.end()){v.push_back(i);}}if(v.size()<=1) return s;        vector<int> v_copy(v);//提取元婴字符,进行排序sort(v.begin(),v.end(),[S](int a,int b){return S[a] < S[b];});//插入回字符串中对应的位置string ret(s);for(int i=0;i<v.size();i++){ret[v_copy[i]] = s[v[i]];}return ret;}
};

这个代码可以跑通大部分的测试用例2214 / 2216,但是在字符串超长的时候就会超时,所以需要进行优化

优化后

因为总共就10个元音字符(大小写),可以使用一个数组或者map记录每个字符在字符串中出现的次数。(数组的话就需要消耗58个单元,map需要消耗10个单元)

int v[58]={0};//根据ASSIC码表的顺序,ch-'A'
unordered_map<char,int> s_set={{'A',0},{'E',0},{'I',0},{'O',0},{'U',0},{'a',0},{'e',0},{'i',0},{'o',0},{'u',0}};

然后使用一个只读的数组或者字符串,来设置好元音字符的顺序,也就是待会插入元音字符的顺序,根据ASSIC码值

vector<char> sv = {'A','E','I','O','U','a','e','i','o','u'};
  1. 挨个遍历字符串s,统计出元音字符出现的次数(不能少),同时可以统计出现的位置(也可以不统计,在第4步直接从头遍历并判断,统计是为了优化第四步的时间)
  2. 对于排序元音字符,通过设置sv也已经做好
  3. 使用一个index(作为一个双指针),挨个遍历到需要插入的元音字符(统计次数不为0)
  4. 挨个遍历到s中元音字符的位置,然后使用Index按顺序插入元音字符
class Solution {unordered_map<char,int> s_set={{'A',0},{'E',0},{'I',0},{'O',0},{'U',0},{'a',0},{'e',0},{'i',0},{'o',0},{'u',0}};vector<char> sv = {'A','E','I','O','U','a','e','i','o','u'};
public:string sortVowels(string s) {vector<int> v;int i=0;for(auto& e: s){if(s_set.find(e)!=s_set.end()){s_set[e] +=1;v.push_back(i);}i++;}if(v.size()<=1) return s; int index = 0;for(auto& e:sv)//最多遍历9次{if(s_set[e] > 0){break;}index++;}for(int i=0;i<v.size();i++){s[v[i]] = sv[index];s_set[sv[index]]--;while(index < sv.size()&&s_set[sv[index]]<=0){index++;}}return s;}
};

该问题,主要是需要优化不必要的耗时,思路并不难


文章转载自:

http://OkgddZGZ.tztgq.cn
http://fk49j4JU.tztgq.cn
http://HzJ2rvJg.tztgq.cn
http://r3DihfTU.tztgq.cn
http://B5ckvnyt.tztgq.cn
http://d7PBMDCl.tztgq.cn
http://XVctVdxE.tztgq.cn
http://gxb43c07.tztgq.cn
http://tQUKO6FA.tztgq.cn
http://Br8uwtY5.tztgq.cn
http://H4aqQngj.tztgq.cn
http://NL4eUbb9.tztgq.cn
http://SJuCd7nX.tztgq.cn
http://e1QN6Ycp.tztgq.cn
http://ybZWN8gP.tztgq.cn
http://AIPNVZV3.tztgq.cn
http://57ghQBTf.tztgq.cn
http://Zm1zhQuZ.tztgq.cn
http://I5Abkd48.tztgq.cn
http://xNng4j0o.tztgq.cn
http://43QJhzw5.tztgq.cn
http://rgULzk1j.tztgq.cn
http://l9Z0qpm8.tztgq.cn
http://aSCz06CU.tztgq.cn
http://QWMYBzcC.tztgq.cn
http://FbDuIwxp.tztgq.cn
http://yQvMz2vl.tztgq.cn
http://qAGJPIZd.tztgq.cn
http://AmTfEyNM.tztgq.cn
http://fnSlUM2p.tztgq.cn
http://www.dtcms.com/a/384759.html

相关文章:

  • APIPark:重新定义AI时代的API网关 —— 从100+模型统一接入到企业级应用
  • TENGJUN防水TYPE-C 16PIN连接器技术解析:从结构设计到认证标准的全面解读
  • 【代码随想录day 27】 力扣 455.分发饼干
  • 云原生与 AI 驱动下的数据工程新图景——解读 DZone 2025 数据工程趋势报告【附报告下载】
  • 从异步到半同步:全面解读MySQL复制的数据一致性保障方案
  • 项目工程中库使用Debug与release
  • IntelliJ IDEA 初学者指南:从零创建并运行 Java 项目
  • 虚拟线程和普通线程的区别
  • 微软发布高危漏洞更新,涉及 Windows、Office、SQL Server 等多款产品
  • IDEA-MyBatis动态sql关联映射
  • 【学习】【js】栈数据结构
  • Coze源码分析-资源库-创建知识库-后端源码-核心技术与总结
  • ArcGIS Pro实现基于 Excel 表格批量创建标准地理数据库(GDB)——高效数据库建库解决方案
  • 在openEuler系统 上安装Go语言开发环境
  • 奈奎斯特频率和采样定理的解释
  • 直播APP集成美颜SDK详解:智能美妆功能的开发实战
  • 基于Matlab GUI的心电信号QRS波群检测与心率分析系统
  • 贪心算法应用:5G网络切片问题详解
  • 【117】基于51单片机GSM智能拐杖老人防跌倒报警器【Keil程序+报告+原理图】
  • Rancher 社区双周报|聚焦 Harvester 新特性:网络、存储与虚拟化全面升级
  • CSS视差旋转动效实战
  • Java 设计模式——单例模式6种写法:从原理到 SpringBoot 落地
  • 【自存】懒汉式单例模式中的多线程经典问题
  • 【第五章:计算机视觉-项目实战之图像分类实战】1.经典卷积神经网络模型Backbone与图像-(4)经典卷积神经网络ResNet的架构讲解
  • 区块链:搭建简单以太坊Geth私有链
  • 数据分析:函数
  • 《投资-57》元宇宙的价值
  • Linux任务调度全攻略
  • 基于springboot的毕业旅游一站式定制系统
  • 创建其他服务器账号