剑指 Offer50. 第一次只出现一次的字符

题目描述

 

 

解法一

哈希表法

思路:首先遍历一遍s,在哈希表里统计字符数量是否大于1;再遍历一遍s,在哈希表中找到首个数量为1的字符

class Solution {
public:
    char firstUniqChar(string s) {
        unordered_map<char, bool> dic;
        for(char c : s)
            dic[c] = dic.find(c) == dic.end();
        for(char c : s)
            if(dic[c]) return c;
        return ' ';
};

注:所用到unorder_map的成员方法

<1>查找以 key 为键的键值对,如果找到,则返回一个指向该键值对的正向迭代器;反之,则返回一个指向容器中最后一个键值对之后位置的迭代器(如果 end() 方法返回的迭代器)。

dic.find(c)

<2>返回指向容器中最后一个键值对之后位置的正向迭代器。

dic.end()

 

解法二

有序哈希表

思路与法一类似,减少了第二轮遍历,提高了效率;

需要借助数组按序存储哈希表dic中的key

class Solution {
public:
    char firstUniqChar(string s) {
        vector<char> p;
        unordered_map<char, bool> dic;
        for(char c : s) {
            if(dic.find(c) == dic.end())
                p.push_back(c);
            dic[c] = dic.find(c) == dic.end();
        }
        for(char c : p) {
            if(dic[c]) return c;
        }
        return ' ';
    }
};

 

posted @ 2023-03-05 21:46  盏茶  阅读(16)  评论(0)    收藏  举报