《劍指offer》:[55]字元流中第一個不重複的字元

塵虛緣_KY發表於2016-06-28
題目:請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是"g"。當從該字元流中讀出前六個字元“google"時,第一個只出現一次的字元是"l"。 
   此題和[35]中找字串中第一次出現一次的字元是類似的。所以詳細過程這裡不再贅述。
方案一:順序掃描。時間複雜度O(N*N)+空間複雜度O(N)。順序掃描後,記錄每一個字元出現的次數。然後順序掃描陣列得到第一個次數為1對應的字元。
方案二:雜湊表法。時間複雜度O(N)+空間複雜度0(N)-雜湊表。前面講到的[35]中的的方法是:用雜湊表記錄每一個字元的次數,利用ASCII作為雜湊表的鍵值,而把字元出現的次數作為雜湊表的值。此題中也是用雜湊表來記錄,ASCII作為雜湊表的鍵值,把字元對應的位置,也可理解為下標作為雜湊表的值。例如陣列初始化為-1,第一個出現的字元就是0,第二個出現就是1...一次類推,如果再次出現則設定為-2,最後查詢的時候,尋找第一個等於0的數。
下面的程式碼主要是用字串來模擬的字元流操作。
具體實現程式碼為:
#include <iostream>
using namespace std;
int index=0;
int Occurrence[256];


void ReSet()
{
	for(int i=0;i<256;i++)
		Occurrence[i]=-1;
	index=1;
}
void InSert(char *str)
{
	while(*str!='\0')
	{
		if(Occurrence[*str]==-1)
			Occurrence[*str]=index;//第一次出現;
		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]<<": 第一次出現一次的字元是:"<<result<<endl;
		else
			cout<<strr[i]<<": 該字串裡沒有出現一次的字元!"<<endl;
	}
	system("pause");
	return 0;
}

執行結果:


相關文章