【剑指Offer-时间效率与空间效率的平衡】面试题50:第一个只出现一次的字符

题目描述

在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).

思路1

遍历字符串,判断当前字符是否在当前字符之后出现过,也就是需要两个循环,时间复杂度为O(n^2)。

思路2

使用哈希表,并遍历两遍字符串。第一次遍历字符串时,记录每个字符出现的次数,由于字符范围为0~255,所以可以把一个长度为256的数组作为哈希表。第二次遍历字符串时,根据哈希表判断该字符出现的次数是否为1,是的话返回即可。代码如下:

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        if(str.length()==0)
            return -1;
        
        int dict[256];
        memset(dict, 0, sizeof(dict));
        for(int i=0; i<str.length(); i++)
            dict[str[i]]++;

        for(int i=0; i<str.length(); i++){
            if(dict[str[i]]==1)
                return i;
        }
        return -1;
    }
};

该算法遍历了两次字符串,时间复杂度为O(n),在运行过程中没有申请新的内存,空间复杂度为O(1)。

原文地址:https://www.cnblogs.com/flix/p/12516322.html