跳转至

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

题目描述

原题

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

示例:

1
2
3
4
5
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 ' ';
    }
}