题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
思路
1.自己创建一个简单的哈希表(即建立一个数组,数组下标为各字符对应的ASCII值,数组值为字符在给定字符串中出现的次数)
2.两次遍历哈希表(第一次遍历:记录给定str中各字符出现次数; 第二次遍历:寻找是否有次数为1的字符,有则返回)
注意:
1.当字符作为数组的下标索引时,自动转换为该字符对应的ASCII值(int 型数字)
2.如果按照书中的已知条件,要求返回char型结果,则要用char* 型指针pHashKey来遍历数组,找到次数为1的字符时,返回*pHashKey 则为char型结果
3.书中说如需要复杂的哈希表功能可直接用C++STL中的map和unordered_map
代码
class Solution {
public:
int FirstNotRepeatingChar(string str) {
//判断有效性
if(str.empty())
return -1;
//创建一个长度256的数组作为哈希表
const int tableSize = 256;
int hashTable[tableSize];
//数组各元素初始化为0
for(int i = 0; i < tableSize; ++i)
hashTable[i] = 0;
//指示字母位置的游标
int index = 0;
//统计给定str中各自符出现次数并将各字符次数保存在哈希表中
while(str[index] != '\0')
hashTable[str[index++]]++;
//再从头遍历哈希表,找到第一个次数为1的字符
index = 0;
while(str[index] != '\0')
{
if(hashTable[str[index]] == 1)
return index;
index++;
}
//没找到
return -1;
}
};