在一个字符串中找到第一个出现,并且只出现一次的字符,例如abaccdeff,输出b
这是谷歌在2006年的一道笔试题。
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
unsigned char findFirstChar(char *str, int n){
int range = sizeof(char)<<8;
int *hash = new int[range];
memset(hash,0,sizeof(int)*range);
for(int i = 0 ; i < n ; ++i){
if(hash[str[i]]==0)
hash[str[i]] = i;
else
hash[str[i]] = -1;
}
int minPos = n;
unsigned char tag = 0;
for(int i = 0 ; i < range; ++i){
//cout<<setw(3)<<(int)i<<" "<<hash[i]<<endl;
if(hash[i]!=0 && hash[i]!= -1 && hash[i] < minPos){
minPos = hash[i];
tag = i;
}
}
delete[] hash;
return tag;
}
int main(){
char *str = "abaccdeff";
cout<<findFirstChar(str,9)<<endl;
system("PAUSE");
return 0;
}
就是一个简单的字符串题,时间复杂度是O(max(n,256))哈希表中的值记录首次出现的位置,最后找到pos最小的那个字符。