给出一个字符串,找出第一个只出现一次的字符。
样例
对于 "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;
}
};
解题思路3:
思路同2,但是由于小写字母只有26个,统计频次不需要动用哈希表,直接建立一个26大小的数组来统计每个字母出现的频次即可。
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 freq[26] = {0};
for(char c : str)
freq[c - 'a']++;
for(int i=0;i<str.size();i++)
if(freq[str[i] - 'a']==1)
return str[i];
return -1;
}
};