题意
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
法1—利用数组解决
由于s只包含小写字母,所以可以定义一个长度为26的数组,下标0表示字母 'a' 的位置,以此类推,下标25表示字母 'z' 的位置。只要在字符串s中出现过的字母,我们都让字母对应的位置元素 加1。
最后再从前往后遍历字符串s,只要遍历过程中发现字母在数组的 对应位置的 值为1,就返回。
C++实现
class Solution
{
public:
char firstUniqChar(string s)
{
if(s.size()==0)
return ' ';
vector<int> chars(26); // 所有元素初始化为0
for(char& ch:s)
{
chars[ch-'a']++;
}
for(char& ch:s)
{
if(chars[ch-'a']==1)
return ch;
}
return ' ';
}
};
法2—哈希表
- 遍历字符串
s
,使用哈希表统计 “各字符数量是否 出现 ”;如果字符第一次出现,就讲哈希表的value置为true,否则值为false。 - 再遍历字符串
s
,在哈希表中找到首个 “值为true 的字符”,并返回。
class Solution
{
public:
char firstUniqChar(string s)
{
if(s.size()==0)
return ' ';
unordered_map<char,bool> hash_table;
for(char ch:s)
{
if(hash_table.find(ch)!=hash_table.end())
hash_table[ch]=false;
else
hash_table[ch]=true;
}
for(char ch:s)
{
if(hash_table[ch]==true)
return ch;
}
return ' ';
}
};