题目描述:
在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出’b’。要求时间复杂度为O(n)。
解题思路:
为了解决这个问题,我们可以定义一个哈希表(外部空间),其键值(Key)是字符,而值(Value)是该字符出现的次数。
同时我们还需要从头开始扫描字符串两次:
1. 第一次扫描字符串时,每扫描到一个字符就在哈希表的对应项中把次数加1。(时间效率O(n))。
2. 第二次扫描时,每扫描到一个字符就能从哈希表中得到该字符出现的次数。这样第一个只出现一次的字符就是符合要求的输出。(时间效率O(n))。
Demo:
class Solution {
public:
int FirstNotRepeatingChar(string str) {
// 用哈希表记录下字符和次数
unordered_map<char, int> mp;
for (auto s : str)
mp[s]++;
int index = -1, sz = str.size();
for (int i = 0; i < sz; ++i)
{
auto tmp = mp.find(str[i]);
// 如果能找到该字符且出现一次则记录下标退出
if ( tmp != mp.end() && tmp->second == 1)
{
index = i; break;
}
}
return index;
}
};
/*
int FirstNotRepeatingChar(string str)
{
vector<int> vec(256, 0);
int tmp;
for (auto s : str)
{
tmp = s;
vec[tmp]++;
}
int index = -1;
for (int i = 0; i < str.size(); ++i)
{
tmp = str[i];
if (vec[tmp] == 1)
{
index = i; break;
}
}
return index;
}
*/