题目:查找字符串第一次中只出现一次的字符
方法一:(不建议使用第一种方法)
从头遍历字符串,当遍历到某个字符时,就将其依次和后面的字符相比较,若不相同,则这个字符就是我们要找的字符。该方法的时间复杂度较大为O(n^2)
方法二:
借助数据容器哈希表,先将字符串遍历一遍,保存每个字符出现的次数。然后再依次遍历每个字符,每遍历一个字符就找出哈希表中对应的次数,这样第一个出现次数为1的字符就是我们要找的字符。时间复杂度为O(n),空间复杂度为O(1)
* 怎样去给这个哈希表嘞?(大小为256、键值为字符的ASCII码值的哈希表)
因为字符(char)一共有256种可能,所以创建一个长度为256的数组,每个字母根据其ASCII码值作为数组的下标对应数组的一个数字,数组中存储的为字符出现的次数。
代码实现:
#include <iostream>
using namespace std;
char FirstNoRepeatChar(char *str)
{
// 字符串为空时返回
if (NULL == str)
return ;
//数组的下标为0~255(也就是哈希表的大小,因为char占一个字节,所以最多能表示256个字符)
const int tablesize = 256;
unsigned int Hashtable[tablesize];//哈希表的大小;
//初始化为0
for (unsigned int i = 0; i<tablesize; i++)
Hashtable[i] = 0;
// 从头开始遍历字符串,确定每个字符出现的次数
char *p = str;
while (*p != '\0')
{
Hashtable[*p]++;
p++;
}
// 找到只出现一次的字符
p = str;
while (*p != '\0')
{
if (Hashtable[*p] == 1)
return *p;
p++;
}
// 如果字符串中的字符均出现两次及两次以上,返回
return '\0';
}
测试函数:
int main()
{
//char str[] = "ahebabkhhello";
//char str[] = "ababtthakchck";
//char str[] = "";
char str[] = "wrold";
char ret = FirstNoRepeatChar(str);
cout << ret << endl;
system("pause");
return 0;
}