第一个只出现一次的字符

题目描述

在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
思路:将每个字符作为数组下标,数组中记录出现的次数。
代码:
    int FirstNotRepeatingChar(string str) {
        map<char,int> mp;
        int len = str.size();
        if(len == 0) return -1;
        for(int i = 0; i < len;i++)
        {
            mp[str[i]]++;
        }
        for(int i = 0; i < len;i++)
        {
            if(mp[str[i]] == 1)
                return i;
        }
        return -1;
    }

 稍稍微微改进版的:减少了时间复杂度,第二次遍历只遍历256次即可。

    int FirstNotRepeatingChar(string str) {
        int arr[256] = {-1};
        memset(arr,-1,sizeof(arr));
        int len = str.size();
        if(len == 0) return -1;
        for(int i = 0; i < len;i++)
        {
            if(arr[str[i]]  == -1)
                arr[str[i]] = i;
            else 
                arr[str[i]] = -2;
        }
        int n  = len;
        for(int i = 0; i < 256;i++)
        {
            if(arr[i] != -1 && arr[i] != -2)
            {
                if(arr[i] < n)
                    n = arr[i];
            }
        }
        if(n == len)
            n = -1;
        return n;
    }

思路:申请256位的辅助数组,将数组置为-1,如果字符第一次出现置为字符位置,如果不是第一次置为-2,最后比较辅助数组中值不为-1和-2的,且下标最小的数。

int型数组存的值,可以代表多种不同的意义。

原文地址:https://www.cnblogs.com/Lune-Qiu/p/9126298.html