哈希表对字符串的高效处理1:在一个字符串中找到第一个只出现一次字符

本文介绍两种高效算法用于在字符串中寻找第一个仅出现一次的字符。第一种算法通过逐个比较字符实现,时间复杂度较高;第二种算法采用哈希表记录字符出现次数,显著提升查找效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能:在一个字符串中找到第一个只出现一次字符

测试数据1:bbccdda  样例输出:a

测试数据2:aabbcc   样例输出:不存在

测试数据3: 0        样例输出:1
//思路一:从头开始扫描这个字符串的每一个字符,当访问到某个字符时拿这个字符和后面的每一个字符进行比较,如果后面没有发现重复的字符,则该字符就是只出现一次的字符。

参考代码如下:

#include<iostream>
#include<string>
using namespace std;

int panduan(string s1,string s2)
{
      int m,sum=0;
      string s3;
      for(m=0;m<s2.size();m++)
      {
            s3=s2[m];
            if(s1==s3)
            {
                  sum++;
            }
      }
      return sum;
}

int main()
{
      string str,s;
      unsigned int i,n=0;
      cin >> str;
      if(str.empty())
      {
            return 0;
      }
      for(i=0;i<str.size();i++)
      {
            s=str[i];
            n=panduan(s,str);
            if(n==1)
            {
                  cout<< s << endl;
                  return 0;
            }
      }
      cout<< "输入字符中没有找到出现一次的字符"<< endl;
      return 0;
}
</span>
测试结果:

思考:如果字符串有n个字符,那么复杂度就为O(n*n),效率太低了;由于题目与字符出现的次数有关,我们想着用一个数据容器来存放每个字符出现的次数,在这个数据容器中可以根据字符来查找它出现的次数,容器作用就是吧一个字符映射成一个数字。考虑定义哈希表,哈希表的键值是字符,值时该字符出现的次数。

//思路二:从头开始扫描字符串两次,第一次扫描字符串时,没扫描到一个字符就在哈希表的对应项中把次数加1;第二次扫描时,每扫描到一个字符就能从哈希表中得到该字符的次数,这样找出只出现一次的。

其实这个就是利用空间复杂度来降低时间复杂度。由于一个包含256个字符的数组,大小1K,大小不变,空间复杂度为O(1);时间复杂度为O(n)。

参考代码如下:

//功能:在一个字符串中找到第一个只出现一次字符,如输入abaccdeff
#include <iostream>
using namespace std;

//找出出现一次字符
char FirstNotRepeatingChar(char* pString)
{
	//输入不合法
	if(pString == NULL)
		return 0;

	//创建一个哈希表,并且初始化
	const int tableSize = 256;
	unsigned int hashTable[tableSize];
	for(int i = 0;i < tableSize; i++)
		hashTable[i] = 0;

	//确定字符串中每个字符出现的次数
	char* pHashKey = pString;
	while(*(pHashKey) != '\0')
		hashTable[*(pHashKey++)]++;

	//找到字符串中只出现一次的那个字符
	pHashKey = pString;
	while(*pHashKey != '\0')
	{
		if(hashTable[*pHashKey] == 1)
			return *pHashKey;
		pHashKey++;
	}

	//如果这个字符串为空,或者字符串中的每一个字符至少出现两次
	return 0;
}

int main(void)
{
	char str[1000];
	cout << "请输入字符串:";
	cin >> str;
	if(FirstNotRepeatingChar(str) == 0)
		cout << "输出字符串中没有找到第一个只出现一次的字符!" << endl;
	else
		cout << "输出字符串中第一个只出现一次的字符为: " << FirstNotRepeatingChar(str) << endl;
	system("pause");
	return 0;
}
运行结果:




                                                                                                                                                                                                                                     ——To_捭阖_youth  0:20



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值