剑指50:第一个只出现一次的字符

题目描述

在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置

思路: 用一个map/unordered_map存或者用一个一维数组 字符和出现次数 然后遍历字符串都存入
             再次遍历字符串顺序,从表中找到second值为1的 返回其在数组中的位置(0~len-1)。
时间复杂度分析:
            用map 插删查 logN
            用unordered_map  插查O(1)  空间O(K)
            用一维数组 按下标访问O(1)    空间O(K)
法1:用unordered_map
class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        if(str.empty())
            return -1;
        unordered_map<char,int> umap;
        for(int i=0;i<str.size();i++){
            umap[str[i]]++;
        }
        for(int i=0;i<str.size();i++){
            if(umap[str[i]]==1)
                return i;
        }
        return -1;
    }
};

法2:

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        if(str.empty())
            return -1;
        int * alpha = new int[256];
        memset(alpha,0,sizeof(alpha));
        for(int i=0;i<str.size();i++){
            int pos = (int)str[i];
            alpha[pos]++;
        }
        for(int i=0;i<str.size();i++){
            int pos = (int)str[i];
            if(alpha[pos]==1)
                return i;
        }
        return -1;
    }
};

猜你喜欢

转载自blog.csdn.net/yanbao4070/article/details/80215063