寻找一个字符串中第一个只出现两次的字符

2.【附加题】–查找一个字符串中第一个只出现两次的字符。
比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)

解法:
利用哈希表;由于ASCII表中一共存在256个字符;所以开辟一个256大小整型数组;将这个数组看做哈希表,将字符的ASCII值当做Key值作为数组下标,将key对应的数组元素的值作为value,先遍历一遍字符串,统计出字符串中每个字符出现的次数;再从字符串的首字符的ASCII码的下标开始遍历一遍哈希表,找出第一个value值为2的key;返回该key对应的字符;就是要求的第一次出现两次的字符;

#include
using namespace std;
char  FirstCharThatAppearsOnlyTwoTimes(char* str)
{
    //1.如果字符串指针为空,返回‘\0’字符
    if (str==NULL)
    {
        return '\0';
    }
    //2.字符串指针不为空,字符串有内容
    unsigned int HashTable[256];
    for (int j=0;j<256;j++)
    {
        HashTable[j]=0;
    }
    char* HashKey=str;
    //统计字符串的字符对应的出现的次数;
    while (*(HashKey)!='\0')
    {
        HashTable[*HashKey]++;
        HashKey++;
    }
    HashKey=str;
    while (*HashKey!='\0')
    {
        if (HashTable[*HashKey]==2)
        {
            return *HashKey;
        }
        HashKey++;
    }
    //2.该字符串中没有只出现两次的字符;
    return '\0';
}
int main()
{
    //1.字符串指针为空
    char* str1=NULL;
    cout<<"FirstCharThatAppearsOnlyTwoTimes:"<//2.字符串指针不为空,即字符串有内容,且字符串中存在只出现两次字符
    char* str2="abcdefabcdefabc";
    cout<<"FirstCharThatAppearsOnlyTwoTimes:"<//3.字符串指针不为空,但该字符串中没有出现只出现两次的字符;
    char* str3="abcdefabcdefabcdef";
    cout<<"FirstCharThatAppearsOnlyTwoTimes:"<return 0;
}

寻找一个字符串中第一个只出现两次的字符_第1张图片

你可能感兴趣的:(每天一练)