leetcode 387. First Unique Character in a String

题目

Given a string, find the first non-repeating character in it and return it’s index.
If it doesn’t exist, return -1.
Examples:

s = "leetcode"
return 0.
s = "loveleetcode",
return 2

题目要求找到字符串第一个只出现一次的index,根据给的例子,下标从0开始,若未找到符合条件的字符则返回-1.

解题思路

这道题分析一下,可以通过二重循环解决,但这种肯定不是最优解法。对于字符串中字符出现次数问题,我们常用的是先统计每个字符的出现次数,然后再做进一步处理,也就是hash表的建立。对于本题,用这样的套路也能很轻易解决。
先循环一遍字符串,统计字符出现次数,然后再循环一遍字符串,找到第一个只出现过一次的字符并返回下标。

AC代码如下

class Solution {
public:
int firstUniqChar(string s) {int count[26]={0};for(int i=0;i<s.size();i++){count[s[i]-'a']++;}int i=0;while(i<s.size()&&count[s[i]-'a']>1) ++i;return i==s.size() ? -1:i;
}
};

总结

这道题在做的时候我之前大意了,用的是bool数组来统计字符出现情况,但提交后发现有问题。再想想自己真蠢,题目并没有说字符只出现偶数次,那这样就没法区分出现一次、三次、五次……的情况。改成int后就顺利AC了。
另外这道题大部分解法都需要循环两次字符串,如果字符串比较长,那循环一次也能实现。在第一遍循环时存下出现次数和下标,这样只要再循环hash表即可。参考程序如下:

class Solution {
public:
int firstUniqChar(string s) {
unordered_map<char, pair<int, int>> m;
int idx = s.size();
for(int i = 0; i < s.size(); i++) {
m[s[i]].first++;
m[s[i]].second = i;
}
for(auto &p : m) {
if(p.second.first == 1) idx = min(idx, p.second.second);
}
return idx == s.size() ? -1 : idx;
}
};

因为考试周,好久没更了。最近暑假会坚持每天更新一到两篇,共勉。

leetcode387题解相关推荐

  1. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  2. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  3. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  4. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  5. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  6. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  7. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

  8. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  9. 【题解搬运】PAT_L1-009 N个数求和

    从我原来的博客上搬运.原先blog作废. (伪)水题+1,旨在继续摸清这个blog(囧 题目 就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和 ...

最新文章

  1. 解题报告:luogu P3469 [POI2008]BLO-Blockade(割点判定 + 思维计算)
  2. Typora添加右键新建Markdown文件
  3. 如何判断强化学习训练是否在收敛?
  4. 硬币 假硬币 天平_小东西叫硬币
  5. coding ssh_exchange_identification: Connection closed by remote host
  6. 有符号数与无符号数间的转换
  7. redis查看key的过期时间_面试官:Redis过期后key是怎么样清理的?
  8. uml类图工具_三款超级轻量化制图工具!每个不超过2MB,堪称神器!
  9. PyQt5学习--基本窗口控件--加载文件-QFileDialog
  10. 对在Qtopia中添加国际化支持一文补充
  11. PHP图片添加文字水印或海报
  12. PHP获取图片和视频类型
  13. c#机器人聊天软件_C#winForm 聊天只能机器人(完整版)
  14. 『转』为什么中国的程序员总被称为码农?
  15. 腾讯云七月优惠活动云服务器限量秒杀20元起
  16. 聊聊 Vue 中 provide/inject 的应用
  17. 转贴:黑客高手必懂基础内容 (发在这里只为娱乐大家)
  18. GridView 72般绝技 转自清清月儿收藏
  19. apache目录遍历漏洞利用_【渗透测试】目录遍历漏洞
  20. openwrt 7621内核启动异常,解决办法记录

热门文章

  1. 医学图像分割之TransUNet
  2. golang学习笔记之string转换
  3. python期末大作业_上海交通大学python期末大作业题目(姚天昉)
  4. Web前端:JS社区推荐的最佳JavaScript框架
  5. 机器学习系列(三)——目标函数、损失函数以及代价函数
  6. BN/Batch Norm中的滑动平均/移动平均/Moving Average
  7. 利用Python做excel文本合并(根据左侧单元格,快速合并右侧单元格内容)
  8. 微信小程序不同分享效果的实现
  9. pb 调用虹软_Python进阶量化交易专栏场外篇12-股票分笔数据跨周期处理
  10. 【Linux】云服务器部署网站后的ab压力测试,服务器网络接口io情况、进程cpu占用等有关情况查看