【剑指offer】面试题50 第一个只出现一次的字符

剑指Offer:快速定位字符串中首个唯一字符
本文提供了一种高效的算法解决方案,用于在大规模字符串中寻找第一个仅出现一次的字符及其位置。通过利用哈希表特性,具体采用C++ STL中的map和unordered_map,实现两次遍历,极大提升了查找效率。

面试题–【剑指Offer】 题目解答

题目描述

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

解题分析

我们能想到最容易的办法就是用当前字符依次的和后边的字符进行比较,如果没有重复的那么就是我们想要的结果,但是这样比较的时间复杂度是O(n2)。不足以AC。

因为题目可以转化为每个字符在字符串中出现的次数,那么我们是不是可选一个容器来存放每个字符出现的次数,最后只要查找出第一个只出现一次的字符就可以了。为了解决这个问题,我们选用哈希表来实现,在C++ STL中,map和unordered_map都实现了哈希表的功能。

算法思想:
我们第一次遍历,遍历字符串,统计每个字符出现的次数。
第二次遍历,遍历哈希表找到第一次出现次数为1的字符。

主要代码c++

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        	int size = str.size();
        	if(size==0) return -1;
        	map<char,int>hashtable;
        	// 统计字符出现的次数
        	for(int i=0; i<size;++i)
        	{
             hashtable[str[i]]++; //对于不在的设为1,在的+1
        	}
        	// 找到第一个为1的字符
        	for(int i=0; i<size;++i)
        	{
            if(hashtable[str[i]]==1)
                return i;       
         	}
        	return -1;
        }
};

tips

注意一下map,unordered_map的使用方法,可以作为哈希表的实现,另外他们的参数也需要看一下~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值