【1】题目
题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'。
【2】思路
第一次扫描时,在哈希表中更新一个字符出现的次数的时间是O(1)。如果字符串长度为n,那么第一次扫描的时间复杂度是O(n)。第二次扫描时,同样O(1)能读出一个字符出现的次数,所以时间复杂度仍然是O(n)。这样算起来,总的时间复杂度是O(n)。同时,我们需要一个包含256个字符的辅助数组,它的大小是1K。由于这个数组的大小是个常数,因此可以认为这种算法的空间复杂度是O(1)。
【3】代码
// Test34.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
using namespace std;
typedef unsigned int uint;
char FirstNotRepeatingChar(char* pString)
{
if (pString==nullptr)
{
return '0\n';
}
//设置hash表,并设置初始化格式
const int tableSize = 256;
unsigned int hashTable[tableSize];
for (uint i = 0; i < tableSize; i++)
{
hashTable[i] = 0;
}
printf("初始化完毕\n");
//记录每一个字符出现的次数
char* pHashkey = pString;
while (*(pHashkey)!='\0')
{
cout<<(*(pHashkey))<<endl;
//*(pHashkey++),地址先向后移动一位,然后在取值,与值相对的hash表的值加1
hashTable[*(pHashkey++)]++;
}
printf("记录完毕\n");
//记录第一次出现次数为1的字符
pHashkey= pString;
while (*pHashkey != '\0')
{
if (hashTable[*pHashkey]==1)
{
return *pHashkey;
}
cout << pHashkey << endl;
pHashkey++;
}
return '0\n';
}
int main()
{
char pString[] = "eeeewiffh";
char result = FirstNotRepeatingChar(pString);
printf("第一个只出现一次的字符为:%c", result);
}