题目描述:

在字符串中找出第一个只出现一次的字符。如输入"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;
}
*/