题目描述
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例:
s = “abaccdeff”
返回 “b”
s = “”
返回 " "
限制:
0 <= s 的长度 <= 50000
解法一、 哈希表
class Solution {
public:
char firstUniqChar(string s) {
unordered_map<char,int> m;
if(s.length()==0)
return ' ';
for(auto c:s)
{
m[c]=m.find(c)==m.end();//只有一个元素时m[c]=1;多个元素时m[c]=0;
}
for(auto c:s)
{
if(m[c])
return c;
}
return ' ';
}
};
时间复杂度O(n),空间复杂度O(1)
也是很容易想到使用哈希表,区分只出现一次的字符和多次的字符的方法有很多。
看了题解才知道可以这样进一步优化。
有序哈希表的键值对按照插入顺序排序,然而c++没有,还是记录一下java的。
class Solution {
public char firstUniqChar(String s) {
Map<Character, Boolean> dic = new LinkedHashMap<>();
char[] sc = s.toCharArray();
for(char c : sc)
dic.put(c, !dic.containsKey(c));
for(Map.Entry<Character, Boolean> d : dic.entrySet()){
if(d.getValue()) return d.getKey();
}
return ' ';
}
}