博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
力扣网 | 每日打卡题 | 387. 字符串中的第一个唯一字符
阅读量:4140 次
发布时间:2019-05-25

本文共 1891 字,大约阅读时间需要 6 分钟。

文章目录

题目

解析

哈希表

  • 用map记录每个元素c出现的位置,并且如果元素c重复出现令map[c]=-1
  • 最后遍历map返回第一个value非-1的元素c的位置
class Solution {
public: int firstUniqChar(string s) {
unordered_map
c2imap; for(int i=0;i

同理:

  • 我们也可以通过用map记录元素出现次数~
class Solution {
public: int firstUniqChar(string s) {
unordered_map
frequency; for (char ch: s) {
++frequency[ch]; } for (int i = 0; i < s.size(); ++i) {
if (frequency[s[i]] == 1) {
return i; } } return -1; }};/*作者:LeetCode-Solution链接:https://leetcode-cn.com/problems/first-unique-character-in-a-string/solution/zi-fu-chuan-zhong-de-di-yi-ge-wei-yi-zi-x9rok/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

队列

我们也可以借助队列找到第一个不重复的字符。队列具有「先进先出」的性质,因此很适合用来找出第一个满足某个条件的元素。

具体地,我们使用与方法二相同的哈希映射,并且使用一个额外的队列,按照顺序存储每一个字符以及它们第一次出现的位置。当我们对字符串进行遍历时,设当前遍历到的字符为 cc,如果 cc 不在哈希映射中,我们就将 cc 与它的索引作为一个二元组放入队尾,否则我们就需要检查队列中的元素是否都满足「只出现一次」的要求,即我们不断地根据哈希映射中存储的值(是否为 -1−1)选择弹出队首的元素,直到队首元素「真的」只出现了一次或者队列为空。

在遍历完成后,如果队列为空,说明没有不重复的字符,返回 -1−1,否则队首的元素即为第一个不重复的字符以及其索引的二元组。

class Solution {
public: int firstUniqChar(string s) {
unordered_map
position; queue
> q; int n = s.size(); for (int i = 0; i < n; ++i) {
if (!position.count(s[i])) {
position[s[i]] = i; q.emplace(s[i], i); } else {
position[s[i]] = -1; while (!q.empty() && position[q.front().first] == -1) {
q.pop(); } } } return q.empty() ? -1 : q.front().second; }};/*作者:LeetCode-Solution链接:https://leetcode-cn.com/problems/first-unique-character-in-a-string/solution/zi-fu-chuan-zhong-de-di-yi-ge-wei-yi-zi-x9rok/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/
你可能感兴趣的文章
流形学习-高维数据的降维与可视化
查看>>
Python-OpenCV人脸检测(代码)
查看>>
python+opencv之视频人脸识别
查看>>
人脸识别(OpenCV+Python)
查看>>
6个强大的AngularJS扩展应用
查看>>
网站用户登录系统设计——jsGen实现版
查看>>
第三方SDK:讯飞语音听写
查看>>
第三方SDK:JPush SDK Eclipse
查看>>
第三方开源库:imageLoader的使用
查看>>
自定义控件:飞入飞出的效果
查看>>
自定义控件:动态获取控件的高
查看>>
第三方开源库:nineoldandroid:ValueAnimator 动态设置textview的高
查看>>
第三方SDK:百度地图SDK的使用
查看>>
Android studio_迁移Eclipse项目到Android studio
查看>>
JavaScript setTimeout() clearTimeout() 方法
查看>>
CSS border 属性及用border画各种图形
查看>>
转载知乎-前端汇总资源
查看>>
JavaScript substr() 方法
查看>>
JavaScript slice() 方法
查看>>
JavaScript substring() 方法
查看>>