【剑指Offer】面试题50-2:字符流中第一个只出现一次的字符

题目:请实现一个函数,用来找出字符流中第一个只出现一次的字符。例如,当从字符流中之读出前两个字符“go”时,第一个只出现一次的字符是‘g’;当从该字符流中读出前 6 个字符“google”时,第一个只出现一次的字符是‘l’。

思路 1:哈希表

根据上一题的思路:我们可以使用一个容器存储从字符流中读出的字符,并用哈希表记录每个字符出现的次数,当需要调用查找只出现一次的字符时,便扫描一遍存储的字符串找出只出现一次的字符。这样的做法,在读入字符时的时间复杂度是 O(1),找出只出现一次的字符的时间复杂度是 O(n);需要一个存储字符的容器和一个哈希表,空间复杂度是 O(n)。我们需要思考更好的算法。

思路 2:记录每个字符的位置

这个算法可以这样描述:使用哈希表记录每个字符的位置,当出现重复字符时,便把值置为一个特殊值(例如:-2);当需要调用查找第一个只出现一次的字符时,只需要遍历整个哈希表,找出值(位置)最小的元素,它的键就是第一个只出现一次的字符。这个算法甚至都不需要存储整个字符串,它的时间复杂度是 O(n),空间复杂度是 O(1)。