本问题对应的 leetcode 原文链接:剑指 Offer 50. 第一个只出现一次的字符
问题描述
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例1 :
输入:s = "abaccdeff"
输出:'b'
示例 2:
输入:s = ""
输出:' '
限制:
0 <= s 的长度 <= 50000
解题思路
视频讲解直达: 本题视频讲解
代码实现
class Solution {
public char firstUniqChar(String s) {
if(s == null || s.length() <= 0){
return ' ';
}
//一个字母出现的次数大于 1 次就不符合要求了,这个时候使用 Fasle 标记状态相对于 Integer 的不断递增更合理,也更省空间。布尔值可以用来判断,可以简化代码逻辑。
Map<Character, Boolean> map = new LinkedHashMap<>();
for(int i = 0; i < s.length(); i++){
map.put(s.charAt(i), !map.containsKey(s.charAt(i)));
}
for(Map.Entry<Character, Boolean> m : map.entrySet()){
if(m.getValue()){
return m.getKey();
}
}
return ' ';
}
}
Python
from collections import OrderedDict
class Solution(object):
def firstUniqChar(self, s):
"""
:type s: str
:rtype: str
"""
if not s:
return ' '
map = OrderedDict()
for c in s:
map[c] = c in map
for k, v in map.items():
if not v:
return k
return ' '
C++
class Solution {
public:
char firstUniqChar(string s) {
if (s.empty()) {
return ' ';
}
map<char, int> mp;
for (int i = 0; i < s.size(); ++i) {
mp[s[i]] = !mp.count(s[i]);
}
for (auto ch : s) {
if (mp[ch]) {
return ch;
}
}
return ' ';
}
};
Go
func firstUniqChar(s string) byte {
if len(s) == 0 {
return ' '
}
m := make(map[byte]int)
for i := range s {
c := s[i]
if _, ok := m[c]; ok {
m[c] = -1
} else {
m[c] = i
}
}
minIndex := len(s)
for _, v := range m {
if v >= 0 && v < minIndex {
minIndex = v
}
}
if minIndex < len(s) {
return s[minIndex]
} else {
return ' '
}
}
JS
/**
* @param {string} s
* @return {character}
*/
var firstUniqChar = function(s) {
if (s == null || s.length <= 0) {
return ' ';
}
// 一个字母出现的次数大于 1 次就不符合要求了,这个时候使用 Fasle 标记状态相对于 Integer 的不断递增更合理,也更省空间。
// 布尔值可以用来判断,可以简化代码逻辑。
let map = new Map();
for (let i = 0; i < s.length; i++) {
map.set(s.charAt(i), !map.has(s.charAt(i)));
}
for (let [key, value] of map.entries()) {
if (value) {
return key;
}
}
return ' ';
};