面试题50:第一个只出现一次的字符
题目描述(1)字符串中第一个只出现一次的字符
在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出‘b’。并返回它的位置, 如果没有则返回 -1(需要区分大小写)。
思路
在字符串中查找某个字符——查找
查找算法:顺序查找、二分查找、二叉排序树查找、哈希表查找
二分查找和二叉排序树,针对有序的数组
1.使用顺序查找:
从头到尾依次取字符,遍历后面的字符与取出的字符比较,若无相同的字符则返回这个字符,否则取下一个字符重复上述过程。时间复杂度为O(n2)
2.哈希表查找:
把字符作为键,遍历字符串,字符的个数作为值。产生哈希表。再按照字符串的顺序从头到尾开始查找第一个值为1的键。
基于数组创建哈希表
键值是字符,char的取值范围较小(0-255),所以可以直接开一个大小为256的数组,以数组下标作为键值(字符ASCII码)。当键值范围较大时(如unicode),不适合用数组创建哈希表。
int FirstNotRepeatingChar(string str) {
//0.特殊
auto len = str.size();
if(len == 0)
return -1;
//1.初始化基于数组的哈希表
int hashTable[256] = {
0};
//2.构建哈希表
for(int i = 0; i<len; ++i)