题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
解题思路:
ascall码的最大值为128,因此不会超过128个,可以申请一个128大小的数组来实现一个简易的哈希表。
时间复杂度为O(n),空间复杂度O(n).
代码实现:
class Solution
/*
ascall码的最大值为128,因此不会超过128个,可以申请一个128大小的数组来实现一个简易的哈希表。
时间复杂度为O(n),空间复杂度O(n).
*/
{
public:
//Insert one char from stringstream
vector<char> v;
void Insert(char ch)
{
v.push_back(ch);
}
//return the first appearence once char in current stringstream
char FirstAppearingOnce()
{
int len = v.size();
vector<char> ans(128);
for(int i=0;i<len;i++){
ans[v[i]]++;
}
for(int i=0;i<len;i++){
if(ans[v[i]] == 1){
return v[i];
}
}
return '#';
}
};
效率:
更优的思路(参考):
1、用一个128大小的数组统计每个字符出现的次数
2、用一个队列,如果第一次遇到ch字符,则插入队列;其他情况不在插入
3、求解第一个出现的字符,判断队首元素是否只出现一次,如果是直接返回,否则删除继续第3步骤
时间复杂度O(1),空间复杂度O(n)
代码实现:
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
/*
思路:
1、用一个128大小的数组统计每个字符出现的次数
2、用一个队列,如果第一次遇到ch字符,则插入队列;其他情况不在插入
3、求解第一个出现的字符,判断队首元素是否只出现一次,如果是直接返回,否则删除继续第3步骤
时间复杂度O(1),空间复杂度O(n)
*/
//Insert one char from stringstream
Queue<Character> queue = new LinkedList<Character>();
int[] s = new int[128];
public void Insert(char ch)
{
s[ch]++;
if(s[ch] == 1){
queue.offer(ch);
}
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
while(queue.size()!=0 && s[queue.peek()] >= 2){
queue.poll();
}
if(queue.size()==0){
return '#';
}
return queue.peek();
}
}
效率: