题目描述
在一个字符串(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的使用方法,可以作为哈希表的实现,另外他们的参数也需要看一下~