50.第一个只出现一次的字符

题目描述

原题

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

示例:

s = "abaccdeff"
返回 "b"
s = ""
返回 " "

限制:

0 <= s 的长度 <= 50000

题解

解法一

class Solution {
public char firstUniqChar(String s) {
if(s == null) return ' ' ;
//不能声明一个集合 因为如果声明一个集合,从set中remove之后
//如果后续有重复的就无法判断
//set校验重复 list没有重复的添加、遇到重复的移除
Set<Character> set = new HashSet<>();
ArrayList<Character> list = new ArrayList<>();
for(int i = 0;i < s.length();i++){
//注意:这里必须返回Character
//因为remove的时候如果是char会转换成int 引发越界
Character c = s.charAt(i);
if(set.contains(c)){
list.remove(c);
}else{
set.add(c);
list.add(c);
}
}
return list.size() > 0 ? list.get(0) : ' ';
}
}

解法二

class Solution {
public char firstUniqChar(String s) {
if(s == null) return ' ' ;
Map<Character,Boolean> map = new LinkedHashMap<>();
for(int i = 0;i < s.length();i++){
char c = s.charAt(i);
map.put(c,!map.containsKey(c));
}
for(Map.Entry<Character,Boolean> entry:map.entrySet()){
if(entry.getValue()) return entry.getKey();
}
return ' ';
}
}