【题目2】给定一个字符串数组,从中找出第一个只出现一次的字母

    这个题目看似简单,把代码调试通过花了我两个多小时

唉,越做对自己越没信心,看来要再把数据结构复习一遍了。

    解题思路:利用哈希表,因为字符最多只有255个,可以

利用这个特性建立一个哈希表,将字符串中所有的字符映射到

这个哈希表中,记录出现的每个字符的个数。最后查找哈希表

获取第一个出现字数为一的字母。

  这里有一个问题,我们如何知道我们取到的是字符串中的第一

个出现一次的字母,这里要求我们在映射字符的时候,顺便将其

第一次出现的位置记录到哈希表结构中去。位置最靠前的当然就

是第一个只出现一次的字母了。

 

  在实现过程中,可以自己实现一个定制的哈希表结构,但是

我嫌太麻烦了,就利用了一些个小技巧,利用一个Set来记录

出现了那些字符,在定义一个结构体记录每个字符出现的次数和

首次在字符串中出现的位置。

  

源代码:(在VC6下通过编译,正确执行)

#include <stdio.h> #include <string.h> #include <set> #include <limits.h> std::set<char> charSet; //用于记录字符出现的次数和第一次出现该字符的位置 struct Character { char c; int count; int pos; }; int FindFirstShowCharacter(char *s) { int len = strlen(s); int i = 0; //将字符串中的所有字符存储到一个集合中去 for(i = 0; i < len; i++) { charSet.insert(s[i]); } //初始化所有字符的统计信息 Character *pCh = new Character[charSet.size()]; std::set<char>::iterator it = charSet.begin(); std::set<char>::iterator end = charSet.end(); int setLen = charSet.size(); for(i = 0; i < setLen,it != end; it++,i++) { char c = *it; pCh[i].c = c; pCh[i].count = 0; pCh[i].pos = 0; } //统计字符出现的次数和首次出现的位置 for(i = 0; i < len; i++) { std::set<char>::iterator begin = charSet.begin(); std::set<char>::iterator it; it = charSet.find(s[i]); int k = 0; while(begin++ != it) k++; pCh[k].count++; if(pCh[k].count <= 1) pCh[k].pos = i; } //找到第一个只出现一次的字母 int minPos = INT_MAX; for(i = 0; i < setLen; i++) { if(pCh[i].count == 1 && pCh[i].pos < minPos) { minPos = pCh[i].pos; } } delete[] pCh; return minPos; } int main() { char* s = "hello,world,hello"; int i = FindFirstShowCharacter(s); putchar(s[i]); return 0; }   

2009/9/20

发现自己对哈希表的理解还不正确,在网上找到一个比较好的解法

char FirstNotRepeatingChar(char* pString) { // invalid input if(!pString) return 0; // get a hash table, and initialize it const int tableSize = 256; unsigned int hashTable[tableSize]; for(unsigned int i = 0; i < tableSize; ++ i) hashTable[i] = 0; // get the how many times each char appears in the string char* pHashKey = pString; while(*(pHashKey) != '/0') hashTable[*(pHashKey++)] ++; // find the first char which appears only once in a string pHashKey = pString; while(*pHashKey != '/0') { if(hashTable[*pHashKey] == 1) return *pHashKey; pHashKey++; } // if the string is empty // or every char in the string appears at least twice return 0; }

你可能感兴趣的:(数据结构,String,struct,delete,iterator,character)