剑指 Offer 50. 第一个只出现一次的字符
题目描述:
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例1️⃣:
输入:s = "abaccdeff"
输出:'b'
示例2️⃣:
输入:s = ""
输出:' '
限制:
0 <= s 的长度 <= 50000
分析:
思路一:
可以将重复的字母统统标记成数字,筛去。
思路二:
直接哈希数组计数,遍历两次即可。
思路一代码实现:
class Solution {
public:
char firstUniqChar(string s) {
if(s.empty())return ' ';
if(s.size()==1)return s[0];
for(int i=0;i<s.size();i++){
if(islower(s[i])){
bool jd=1;
for(int j=i+1;j<s.size();j++){
if(s[j]=='1'){continue;}//为数字,则直接略过
if(s[j]==s[i]){jd=0;s[j]='1';};//重复,则jd更为否
}
if(jd)return s[i];//jd作为条件,检验
}
}
return ' ';
}
};
思路二代码实现:
class Solution {
public:
char firstUniqChar(string s) {
unordered_map<char,int>cnt;//哈希表计数
for(int i=0;i<s.size();i++){
cnt[s[i]]++; //哈希表统计出现各字母次数
}
for(int j=0;j<s.size();j++){
if(cnt[s[j]]==1)return s[j];//如果字母出现次数为一,返回该字符
}
return ' ';//若找不到单一字符,则返回空格
}
};
评析:用了两层循环,耗费时间;但并没增加多少空间。
评析:哈希表是一种用空间换时间的手段。