在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)
解题思路:字符(key)——字符出现的次数(value) -—— >哈希表
1.第一遍遍历数组,找到每个字符对应的次数。辅助数组下标key为数组字符的ASCII码;辅助数组的值value为字符出现的次数。ASCII有256个字符,所以辅助数组大小为256。
2.第二遍遍历数组,根据数组的顺序找到辅助数组中第一次出现一次的字符并返回该字符的位置
解法1:辅助数组:
int FirstNotRepeatingChar(string str) {
if ( str.length() == 0)
return -1;
unsigned int hashTime[256] = {0};
for(int i =0;i<str.length();++i)
hashTime[str[i]]++;//下标为str[i]即ASCII码
for(int i =0;i<str.length();++i)
{
if(hashTime[str[i]] == 1)
return i;
}
return -1;
}
解法2:利用map容器
链接:https://www.nowcoder.com/questionTerminal/1c82e8cf713b4bbeb2a5b31cf5b0417c
来源:牛客网
int FirstNotRepeatingChar(string str) {
map<char, int> mp;
for(int i = 0; i < str.size(); ++i)
mp[str[i]]++;
for(int i = 0; i < str.size(); ++i){
if(mp[str[i]]==1)
return i;
}
return -1;
}
本文介绍了一种高效的算法,用于在一个由字母组成的字符串中找到第一个仅出现一次的字符,并返回其位置。通过两次遍历字符串,利用哈希表或辅助数组记录字符出现的频率,最终实现快速查找。

被折叠的 条评论
为什么被折叠?



