美文网首页图解LeetCode算法
图解LeetCode——剑指 Offer 50. 第一个只出现一

图解LeetCode——剑指 Offer 50. 第一个只出现一

作者: 爪哇缪斯 | 来源:发表于2023-02-12 11:13 被阅读0次

    一、题目

    在字符串 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"为例,详细了解一下具体的处理过程。请见下图所示:

    四、代码实现

    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 ' ';
        }
    } 
    

    今天的文章内容就这些了:

    写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

    更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(o)/ ~ 「干货分享,每天更新」

    相关文章

      网友评论

        本文标题:图解LeetCode——剑指 Offer 50. 第一个只出现一

        本文链接:https://www.haomeiwen.com/subject/wihdkdtx.html