前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指offer——第一个只出现一次的字符

剑指offer——第一个只出现一次的字符

作者头像
AI那点小事
发布2020-04-18 00:49:54
4060
发布2020-04-18 00:49:54
举报
文章被收录于专栏:AI那点小事

概述

题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1.


思路

当字符串为空返回-1,初始化计数哈希表cnt来记录每个字符的出现的次数, 位置哈希表index来记录每个字符第一次出现的位置,集合s存放不重复元素。 遍历整个字符串,首先对每个字符str[i]的出现次数加1,若index中没有str[i]且cnt[str[i]]为1,那么把str[i]放入s,且赋值index[str[i]] = i。否则从s和index中删除str[i]。如出现整个字符串只有一个不字符,返回-1,否则遍历s集合,找到第一个只出现一次的字符的下标。


C++ AC代码

代码语言:javascript
复制
#include <iostream>
#include <map> 
#include <set>
using namespace std;

class Solution {
    public:
        int FirstNotRepeatingChar(string str) {
            if(str.length() == 0){
                return -1;
            }
            map<char,int> cnt;          // 用于字符计数
            map<char,int> index;        // 用于记录字符的首次出现位置
            set<char> s;                // 记录只出现一次的字符
            bool flag = false;
            for(int i = 0 ; i < str.length() ; i++){
                cnt[str[i]]++;
                if(index.find(cnt[i]) == index.end() && cnt[str[i]] == 1){
                    index[str[i]] = i;
                    s.insert(str[i]);
                }else{
                    index.erase(str[i]);
                    s.erase(str[i]);
                }
                if(cnt[str[i]] == str.length()){
                    flag = true;    //判断字符串有重复1个字符组成
                    break; 
                }
            }
            if(flag == true){
                return -1;
            }
            int min = 10000;
            for(set<char>::iterator i = s.begin() ; i != s.end() ; i++){
                if(cnt[*i] == 1 && index[*i] < min ){
                    min = index[*i];
                }
            }
            return min;
        }
};

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 思路
  • C++ AC代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档