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

力扣:字符串中的第一个唯一字符(C++实现)

在这里插入图片描述

在这里插入图片描述

题目部分:

在这里插入图片描述

解题思路:

方案一:

首先认真审题的小伙伴们一定会发现就是题目给了提示只包含小写字母,也就是说我们的排查范围是小写的26个字母。为了怕有的友友们一时短路想不起来,我就其按照顺序列出来吧。

即:a、b、c、d、e、f、g、h、i、j、k、l、m、n、o、p、q、r、s、t、u、v、w、x、y、z

根据题意,我们的目标就是从给出的字符串中,找出出现的第一个不重复出现的小写26个字母中的一个,并将其对应在字符串数组中的下标位置返回去;若找完整个字符串后,均为重复出现的子母,即未发现只出现一次的子母,则返回-1。

附:ASCII表

在这里插入图片描述

结合我们的ASCII表就可以很轻松的做出此题来,根据该表的提示,我们可以发现初始字母a所映射对应的整数是97,那么我们就可以开始做文章了。

定义一个计算每个小写字母出现次数的数组(默认我都是按照26个字母的顺序),并初始化为0。

紧接着用一个循环来统计出每个字母所出现的次数,循环内如何操作呢?代码走的逻辑就是拿当前字符串中当前对应的字母映射的整数值减去字母a映射的整数值,就能得知该字母在我们统计出现次数数组中的位置,并表示它已经出现一次了,所以要在原有次数上加一。

在这里插入图片描述

为了怕大家不懂我统计次数循环内代码走的逻辑,我特意拿示例1来做示范讲解。

示例1给的字符串第一个字母是l,在ASCII表映射对应的整数是108,前面我们不是有讲到初始字母a在该表映射对应的整数是97吗?用108-97=11,也就是代表数组中的第11个位置(也就是l的位置)的字母出现了一次【需要清楚的是数组下标是从0开始,家人们别忘记了】,因此要在该元素位置次数+1。

在这里插入图片描述

很多xdm可能会疑惑为什么要减字母a呢?干嘛不减字母b呢?这就是可能you钻牛角尖了。我在前面就有说过我默认的字母数组出现次数的排序,是按照它们原本的顺序。对应关系就是我下图所示:

在这里插入图片描述

只有从减字母a开始才能对应的了上图的关系,若到这里还不能理解的话,我建议大神你回炉重造!

在这里插入图片描述

前面所的是第一个循环,接着是代码中出现的第二个循环的作用——就是找出这个字符串中第一个不重复的字符,然后将其数组的下标返回回去。这第二个循环是需要基于第一个循环的,若字母都是至少出现了两次(即重复),就意味着并不符合题意的要求,按照题目的规定就返回-1回去。

如果你理解了前面第一个循环那么第二个循环理解就会相对简单,走的逻辑跟第一个循环类似,只不过是为了找出只出现1次的字母,顺带将其数组下标返回即可完成题目要求。

在这里插入图片描述

方案一演示代码讲解如下:

在这里插入图片描述

附:方案一代码提取:

class Solution {
public:int firstUniqChar(string s) {// 定义26个字母出现次数的数组,初始化都为0// 默认的26个字母顺序为:a、b、c、d、e...x、y、zint countArray[26] = { 0 };// 统计每个字母所出现的次数for (size_t i = 0; i < s.size(); ++i){countArray[s[i] - 'a']++;}// 找出它第一个不重复的字符,并返回数组下标for (int j = 0; j < s.size(); ++j){if (countArray[s[j] - 'a'] == 1){return j;}}return -1;}
};

测试结果:

方案一:

在这里插入图片描述

不出意外的话家人们必定是狠狠拿下!

在这里插入图片描述

备注:

楼主不才,不喜勿喷,若有错误或需要改进的地方,非常感谢你的指出,我会积极学习采纳。谢谢家人们一直以来的支持和鼓励,我会继续努力再接再励创作出更多优质的文章来回报家人们的。编程爱好的xdm,若有编程学习方面的问题可以私信我一同探讨(我尽力帮),毕竟“众人拾柴火焰高”,大家一起交流学习,共同进步!

在这里插入图片描述

2023年4月8日

http://www.lryc.cn/news/57868.html

相关文章:

  • 攻防世界 favorite_number mfw、[BJDCTF2020]ZJCTF,不过如此
  • SummingMergeTree
  • JUC并发编程基础篇第一章之进程/并发/异步的概念[理解基本概念]
  • c语言—指针进阶
  • 总结二分法
  • 二叉搜索树和AVL树
  • 计算机体系结构量化研究方法【2】高速缓存Cache
  • 初识设计模式 - 迭代器模式
  • 三路快排(基于三指针单趟排序的快速排序)+快排时间复杂度再分析
  • Eyeshot Ultimate 2023 Crack
  • JAVA-8-[SpringBoot]入门程序案例和原理分析
  • 前端工程化
  • 【redis】单线程 VS 多线程(入门)
  • 2023蓝桥杯Java研究生组赛题
  • 多维时序 | MATLAB实现CNN-BiLSTM-Attention多变量时间序列预测
  • 微积分——Rolle定理的理解(罗尔定理)
  • linux内核之select/poll/epoll
  • 文件流下载
  • C语言模拟实现:atoi函数
  • LeetCode.每日一题 2427. 公因子的数目
  • 蓝牙BQB认证 - HFP profile配置说明
  • 【接口测试工具】Eolink Apikit 快速入门教程
  • 使用Python和OpenCV实现实时人脸检测并保存截图
  • [linux kernel]slub内存管理分析(7) MEMCG的影响与绕过
  • MySQL创建数据库(CREATE DATABASE语句)
  • 【JavaWeb】4—Tomcat
  • 宝塔Linux面板部署Python flask项目
  • spring中产生bean的几种方式
  • OD-火星文计算(Python)
  • 【vue3教程】初入了解vue3的基本结构