图解LeetCode——剑指 Offer 50. 第一个只出现一次的字符

2023-05-10 13:22:52 浏览数 (1)

一、题目

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

二、示例

2.1> 示例 1:

【输入】s = "abaccdeff" 【输出】'b'

2.2> 示例 2:

【输入】s = "" 【输出】' '

限制:

  • 0 <= s 的长度 <= 50000

三、解题思路

根据题目描述,我们需要做到两点:

第1点】找出字符串 s 中,每个字符的出现次数; 【第2点】去重保存字符在 s 中的出现顺序

那么针对上面的两点,我们创建两个变量:

int[] times】用于记录字符串 s 中每个字符的出现次数; 【char[] order】用于记录字符串 s 中字符的出现顺序;

具体的逻辑就是,首先遍历字符串s中的所有字符,然后保存在times中,其中key存储的是字符,value存储的是该字符出现的次数;当发现某个字符第一次出现的时候,就将其保存到order数组中;

然后我们再遍历order数组,并根据times中记录的每个字符的出现次数,只要发现有字符出现次数是1次,那么就作为方法结果返回即可。

下面以s = "abaccdeff"为例,详细了解一下具体的处理过程。请见下图所示:

四、代码实现

代码语言:javascript复制
class Solution {
    public char firstUniqChar(String s) {
        int index = 0;
        int[] times = new int[26];
        char[] order = new char[26];
        for (char c : s.toCharArray()) {
            if (times[c - 'a'] == 0) order[index  ] = c;
            times[c - 'a']  ;
        }
        for (int i = 0; i < order.length; i  )
            if (order[i] != 0 && times[order[i] - 'a'] == 1) return order[i];
        return ' ';
    }
} 

0 人点赞