给出一个字符串,找出第一个只出现一次的字符。
样例
对于 "abaccdeff"
, 'b'
为第一个只出现一次的字符.
解题思路1:
不能想当然使用先排序后寻找的方法,时间复杂度太高。
如果所给字符串仅包括小写字符,则自然想到开一个大小为26的数组,保存每个字母出现的次数,然后在扫描一次字符串,判断出现次数是否为1,若是则转换返回所在字符,扫描结束后若还没有返回,说明没有字符只出现一次,返回-1.
class Solution { public: /** * @param str: str: the given string * @return: char: the first unique character in a given string */ char firstUniqChar(string &str) { // Write your code here int a[26] = {0}; for(int i=0;i<str.size();i++) a[str[i]-'a']++; for(int i=0;i<26;i++) if(a[i]==1) return i+'a'; return -1; } };
解题思路2:
如果不仅仅有小写字母,则使用哈希表建立每个字符和其出现次数的映射,然后按顺序遍历字符串,找到第一个出现次数为1的字符,返回其位置即可。
class Solution { public: /** * @param str: str: the given string * @return: char: the first unique character in a given string */ char firstUniqChar(string &str) { // Write your code here unordered_map<char,int> m; for(char c : str) m[c]++; for(int i=0;i<str.size();i++) { if(m[str[i]]==1) return str[i]; } return -1; } };