《劍指offer》:[55]字符流中第一個不重復的字符
來源:程序員人生 發布時間:2016-08-16 18:05:43 閱讀次數:2415次
題目:請實現1個函數用來找出字符流中第1個只出現1次的字符。例如,當從字符流中只讀出前兩個字符"go"時,第1個只出現1次的字符是"g"。當從該字符流中讀出前6個字符“google"時,第1個只出現1次的字符是"l"。
此題和[35]中找字符串中第1次出現1次的字符是類似的。所以詳細進程這里不再贅述。
方案1:順序掃描。時間復雜度O(N*N)+空間復雜度O(N)。順序掃描后,記錄每個字符出現的次數。然后順序掃描數組得到第1個次數為1對應的字符。
方案2:哈希表法。時間復雜度O(N)+空間復雜度0(N)-哈希表。前面講到的[35]中的的方法是:用哈希表記錄每個字符的次數,利用ASCII作為哈希表的鍵值,而把字符出現的次數作為哈希表的值。此題中也是用哈希表來記錄,ASCII作為哈希表的鍵值,把字符對應的位置,也可理解為下標作為哈希表的值。例如數組初始化為⑴,第1個出現的字符就是0,第2個出現就是1...1次類推,如果再次出現則設置為⑵,最后查找的時候,尋覓第1個等于0的數。
下面的代碼主要是用字符串來摹擬的字符流操作。
具體實現代碼為:
#include <iostream>
using namespace std;
int index=0;
int Occurrence[256];
void ReSet()
{
for(int i=0;i<256;i++)
Occurrence[i]=⑴;
index=1;
}
void InSert(char *str)
{
while(*str!='\0')
{
if(Occurrence[*str]==⑴)
Occurrence[*str]=index;//第1次出現;
else if(Occurrence[*str]>=0)
Occurrence[*str]=2;//在此出現;
str++;
}
}
char FirstApperance(char *str)
{
char ch='\0';
while(*str!='\0')
{
if(Occurrence[*str]==1)
{
ch=*str;
return ch;
}
str++;
}
return ch;
}
int main()
{
char *strr[3]={"abcdabc","abcabc","abc"};
for(int i=0;i<3;i++)
{
ReSet();
InSert(strr[i]);//讀入字符;
char result=FirstApperance(strr[i]);
if(result !='\0')
cout<<strr[i]<<": 第1次出現1次的字符是:"<<result<<endl;
else
cout<<strr[i]<<": 該字符串里沒有出現1次的字符!"<<endl;
}
system("pause");
return 0;
}
運行結果:

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈