题目描述
解法一
哈希表法
思路:首先遍历一遍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 ' '; } };
标签:字符,end,第一次,dic,char,键值,Offer50,哈希,find From: https://www.cnblogs.com/zc-030/p/17181802.html