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

Posted 炫云云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 50. 第一个只出现一次的字符相关的知识,希望对你有一定的参考价值。

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

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

示例:

s = "abaccdeff"
返回 "b"

s = "" 
返回 " "

限制:

0 <= s 的长度 <= 50000

哈希表

思路与算法

我们可以对字符串进行两次遍历。

在第一次遍历时,我们使用哈希映射统计出字符串中每个字符出现的次数。在第二次遍历时,我们只要遍历到了一个只出现一次的字符,那么就返回该字符,否则在遍历结束后返回空格。

复杂度分析

时间复杂度: O ( n ) O(n) O(n) ,其中 n n n 是字符串 s s s 的长度。我们需要进行两次遍历。

空间复杂度: O ( ∣ Σ ∣ ) O(|\\Sigma|) O(Σ) ,其中 Σ \\Sigma Σ 是字符集,在本题中 s s s 只包含小写字母,因此 ∣ Σ ∣ ≤ 26 |\\Sigma| \\leq 26 Σ26 。我们需要 O ( ∣ Σ ∣ ) O(|\\Sigma|) O(Σ)的空间存储哈希映射。

class Solution(object):
    def firstUniqChar(self, s):
        """
        :type s: str
        :rtype: str
        """
        frequency = collections.Counter(s)
        for i , ch in enumerate(s):
            if frequency[ch] ==1:
                return ch
        return ' '
class Solution(object):
    def firstUniqChar(self, s):
        """
        :type s: str
        :rtype: str
        """
        dic = {}
        for c in s:
            dic[c] = not c in dic
        for c in s:
            if dic[c]:
                return c
        return ' '

Python 代码中的 not c in dic 整体为一个布尔值; c in dic 为判断字典中是否含有键 c 。

哈希表存储索引

思路与算法

我们可以对方法一进行修改,使得第二次遍历的对象从字符串变为哈希映射。

具体地,对于哈希映射中的每一个键值对,键表示一个字符,值表示它的首次出现的索引(如果该字符只出现一次)或者 − 1 -1 1​(如果该字符出现多次)。当我们第一次遍历字符串时,设当前遍历到的字符为 c c c,如果 c c c 不在哈希映射中,我们就将 c c c​与它的索引作为一个键值对加入哈希映射中,否则我们将 c c c​ 在哈希映射中对应的值修改为 -1。

在第一次遍历结束后,我们只需要再遍历一次哈希映射中的所有值,找出其中不为 -1的最小值,即为第一个不重复字符的索引,然后返回该索引对应的字符。如果哈希映射中的所有值均为 -1,我们就返回空格。

class Solution(object):
    def firstUniqChar(self, s):
        """
        :type s: str
        :rtype: str
        """
        position = dict()
        n = len(s)
        for i ,ch in enumerate(s):
            if ch in position:
                position[ch] = -1
            else:
                position[ch] = i
        first = n
        for pos in position.values():# 遍历值
            if pos != -1 and pos < first:
                first = pos
        return " " if first == n else s[first]

参考

Krahets - 力扣(LeetCode) (leetcode-cn.com)

以上是关于剑指 Offer 50. 第一个只出现一次的字符的主要内容,如果未能解决你的问题,请参考以下文章

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

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

剑指Offer--第50题 第一次只出现一次的字符

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

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

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