【面试题】字符串中第一个只出现一次的字符

问题描述:

在字符串中找出第一个只出现一次的字符,例如字符串 str = “abcdabcdef “,那么对于这个字符串,第一个只出现一次的字符就是 e 。

首先这道题可以考虑遍历:从第一个字符开始,挨个与后面字符作比较,如果有重复的字符,就跳出本次循环,再从第二个字符开始往后比较,类似Bubble_Sort,在这种做法中,就是利用两层for循环就可以搞定。

但是时间复杂度为O(n^2),往往不是最优解法。

查找第N次出现的题目,首先要想到哈希思想。利用映射思想处理。
哈希处理的时间复杂度为 O(n),空间复杂度为常数。

哈希思想解决的好处就是提高程序运行效率。

char GetFirstChar(const char* str)
{
    assert(str);
    int HashTable[26] = {0};
    char *ch = str;
    while(*ch)
    {
        HashTable[*ch - 'a'] ++;
        ++ch;
    }
    ch = str;
    while(*ch)
    {
        if(HashTable[*ch - 'a'] == 1)
        {
            return *ch;
        }
        ++ch;
    }
    return -1;
}

如果这个字符串不仅仅是小写,还含有其他特殊符号怎么处理?只需要把哈希映射表扩容到256即可。因为字符是8bit类型,总共有256个字符。

char GetFirstChar(const char* str)
{
    assert(str);
    int HashTable[256] = {0};
    char *ch = str;
    while(*ch)
    {
        HashTable[(unsigned char)*ch ] ++;
        ++ch;
    }
    ch = str;
    while(*ch)
    {
        if(HashTable[(unsigned char)*ch] == 1)
        {
            return *ch;
        }
        ++ch;
    }
    return -1;
}

猜你喜欢

转载自blog.csdn.net/m0_37925202/article/details/81052888