/***********************************************************************
問題:在一個只有大小寫字串中查詢第一個只出現一次的字母
input: aacddcvghhgii
output: v
思路:使用hashtable 來使得時間複雜度為O(n)
建立hashtable
**********************************************************************/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
//雜湊函式 返回索引地址
int HashFunction(char ch)
{
if(islower(ch))
return ch-'a';
else
if(isupper(ch))
return 26+ch-'A';
}
void MapHashTable(char HashTable[],char a[],int len)
{
int pos;
for(int i=0;i<len;i++)
{
pos=HashFunction(a[i]);
//if(HashTable[pos]==0) //表明未被賦值
++HashTable[pos];
}
}
char HashSearch(char HashTable[],char a[],int len)
{
int pos;
for(int i=0;i<len;i++)
{
pos=HashFunction(a[i]);
if(1==HashTable[pos])
{
if( 26<=pos && pos<=51)
return pos-26+'A';
else
return pos+'a';
}
}
return -1; //未找到符合題意
}
int main()
{
char str[]="aacddcBvghhAgii";
int len=strlen(str);
printf("源字串為:%s\n",str);
char HashTable[52]; //雜湊表 用於儲存次數
memset(HashTable,0,sizeof(HashTable)/sizeof(char));
MapHashTable(HashTable,str,len);
char ch=HashSearch(HashTable,str,len);
if(ch!=-1)
printf("第一次只出現一次的字元為:%c\n",ch);
}