算法思想一:哈希表
解题思路:
通过哈希表统计字符流中每个字符出现的次数,顺便将字符流保存在string中,然后再遍历string,从哈希表中找到第一个出现一次的字符
图解:
代码展示:
Python版本
# -*- coding:utf-8 -*- class Solution: def __init__(self): # 字符数组 self.s = [] # 哈希表 self.count = {} # 返回对应char def FirstAppearingOnce(self): # write code here length = len(self.s) for i in range(length): if self.count[self.s[i]] == 1: return self.s[i] return '#' def Insert(self, char): # write code here # 计算每一个字符出现的次数,存储在哈希表中 self.s += char if char not in self.count: self.count[char] = 1 else: self.count[char] += 1
复杂度分析:
时间复杂度O(N):两次遍历,N为字符串长度
空间复杂度O(N):哈希表空间
算法思想二:队列
解题思路:
设置一个数组,记录每个字符的三种状态:未出现(0),出现一次(1),多次出现(-1)。
设置一个队列,记录每次从字符流中读取时,尚未出现过的字符。
查询当前已读取的字符流中第一个只出现一次的字符,需要判断队首字符状态,执行出列操作直至队首元素只出现过一次。
代码展示:
JAVA版本
import java.util.Queue; import java.util.LinkedList; public class Solution { int[] map = new int[256]; Queue <Character> queue = new LinkedList<Character>(); //Insert one char from stringstream public void Insert(char ch) { if(map[ch] == 0) { map[ch] = 1; queue.offer(ch); } else if(map[ch] == 1) { map[ch] = -1; } } //return the first appearence once char in current stringstream public char FirstAppearingOnce() { while(!queue.isEmpty() && map[queue.peek()] == -1) { queue.poll(); } if(!queue.isEmpty()) { return queue.peek(); } return '#'; } }
复杂度分析:
时间复杂度O(N):N为字符串长度
空间复杂度O(N):数组、队列占用空间