您的位置:首页 > Web前端

剑指Offer学习总结-第一个只出现一次的字符

2018-01-24 16:20 253 查看

剑指Offer学习总结-第一个只出现一次的字符

本系列为剑指Offer学习总结,主要是代码案例的分析和实现:

书籍链接:http://product.dangdang.com/24242724.html

原作者博客:http://zhedahht.blog.163.com/blog/static/254111742011101624433132/

原作者博客链接有完整的项目代码下载。

第一个只出现一次的字符

题目

题目:在字符串中找出第一个只出现一次的字符。如输入”abaccdeff”,则输出’b’。要求时间复杂度为O(n)。

最直观的解法

最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路的时间复杂度是O(n2),但是不满足要求。

空间换时间的解法:

为了解决这个问题,我们可以定义一个哈希表(外部空间),其键值(Key)是字符,而值(Value)是该字符出现的次数。

同时我们还需要从头开始扫描字符串两次:

第一次扫描字符串时,每扫描到一个字符就在哈希表的对应项中把次数加1。(时间效率O(n))

第二次扫描时,每扫描到一个字符就能从哈希表中得到该字符出现的次数。这样第一个只出现一次的字符就是符合要求的输出。(时间效率O(n))

这样算起来,总的时间复杂度仍然是O(n)

char FirstNotRepeatingChar(char* pString)
{
if(pString == NULL)
return '\0';

//字符是一个8位的二进制单位,共有256种可能
const int tableSize = 256;
//借助数组来模拟哈希表,只用1K的空间消耗
unsigned int hashTable[tableSize];
for(unsigned int i = 0; i<tableSize; ++ i)
hashTable[i] = 0;

char* pHashKey = pString;
//如果存在对应字符则计数
while(*(pHashKey) != '\0')
hashTable[*(pHashKey++)] ++;

//初始化指针  并且找出第一个为1的数值
pHashKey = pString;
while(*pHashKey != '\0')
{
if(hashTable[*pHashKey] == 1)
return *pHashKey;

pHashKey++;
}

return '\0';
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: