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

91 阅读1分钟

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

示例 1:

输入:s = "abaccdeff" 输出:'b'

解题思路

  1. 先遍历一边s,统计各字符出现的次数
  2. 找出第一个出现次数为1的字符

这里很明显是一个Key-Value关系,故有以下几种思路

  1. 可以用HashMap来记录字符和出现的次数是否为1次,再遍历一边s,找到第一次出现次数是1的字符
  2. 方法1的缺点是,在最差的情况下,需要完整遍历两遍s,为此可以使用LinkedHashMap来记录字符出现的顺序关系,则第二遍遍历最多不会超过26次
  3. 题目中还有一个限定条件就是s只包含小写字母,很明显,基于这个条件可以采用数组的方式来解决

算法流程

数组实现

  1. 初始化:声明一个容量为26的数组
  2. 遍历:遍历s,直接将字符作为索引值,在其对应的索引位置+1
  3. **2次遍历:**遍历s,返回第一个值为1的索引值

代码

class Solution {
    public char firstUniqChar(String s) {
        int[] res = new int[26];
        char[] chars = s.toCharArray();
        for (char c : chars) {
            res[c - 'a']++;
        }
        for (char c : chars) {
            if (res[c - 'a'] == 1) {
                return c;
            }
        }
        return ' ';
    }
}