HWOJ 在一个字符串中找到第一个只出现一次字符

本文介绍了一种高效的算法,用于在一串字符中找到首次出现且仅出现一次的字符。通过使用哈希表记录每个字符的出现次数,算法能在O(n)的时间复杂度内完成任务。

HWOJ 在一个字符串中找到第一个只出现一次字符

题目:在一个字符串中找到第一个只出现一次字符

Alt text

测试数据1:bbccdda 样例输出:a
测试数据2:aabbcc 样例输出:.
测试数据3: 0 样例输出:1
题目分析:
①最直观的思路:从头开始扫描这个字符串的每一个字符,当访问到某个字符时拿这个字符和后面的每一个字符进行比较,如果后面没有发现重复的字符,则该字符就是只出现一次的字符。这样做的复杂度为O(n^2),效率太低了。
②由于题目与字符出现的次数有关,我们想着用一个数据容器来存放每个字符出现的次数,在这个数据容器中可以根据字符来查找它出现的次数,容器作用就是吧一个字符映射成一个数字。考虑定义哈希表,哈希表的键值是字符,值时该字符出现的次数。
算法思路:
从头开始扫描字符串两次,第一次扫描字符串时,每扫描到一个字符就在哈希表的对应项中把次数加1;第二次扫描时,每扫描到一个字符就能从哈希表中得到该字符的次数,这样找出只出现一次的。
其实这个就是利用空间复杂度来降低时间复杂度。由于一个包含256个字符的数组,大小1K,大小不变,空间复杂度为O(1);时间复杂度为O(n)。

===============================================================================
参考代码:

//.cpp
#include <iostream>
const int maxn = 1000;
using namespace std;

//找出出现一次字符
bool FindChar(char* pInputString, char *pChar)
{
    //输入不合法
    if(pInputString == NULL)
        return 0;

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

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

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

        }
        pHashKey++;
    }

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

int main()
{
    char str[maxn];
    char str1[maxn] = {0};

    cin >> str;
    if(FindChar(str,str1) == 0)
        cout << "." << endl;
    else
        cout << str1 << endl;
    system("pause");
    return 0;
}

  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值