返回

每日一练(23):从字符串中找到第一个只出现一次的字符

后端

问题

给定一个字符串 s ,找到 第一个只出现一次的字符 ,并返回它的 索引

如果 没有 这样的字符,返回 -1

示例 1:

输入:s = "leetcode"
输出:0

示例 2:

输入:s = "loveleetcode"
输出:2

示例 3:

输入:s = "aabb"
输出:-1

提示:

  • 0 <= s.length <= 50000
  • s 由小写和大写英文字母和空格组成。

解决方案

我们可以使用哈希表来解决这个问题。哈希表中存储字符和其出现的次数。然后遍历字符串,如果遇到哈希表中没有的字符,则返回该字符的索引。如果遍历完整个字符串,哈希表中没有这样的字符,则返回 -1

以下是详细的实现步骤:

  1. 创建一个哈希表,将每个字符作为键,其出现的次数作为值。
  2. 遍历字符串 s 中的每个字符 c
  3. 如果哈希表中没有字符 c ,则将其添加到哈希表中,并将其出现的次数设置为 1
  4. 否则,将哈希表中字符 c 出现的次数增加 1
  5. 遍历哈希表,找到第一个出现的次数为 1 的字符 c ,并返回其索引。
  6. 如果遍历完整个哈希表,没有找到这样的字符,则返回 -1

以下是 Python 实现:

def first_unique_char(s):
    # 创建哈希表
    char_counts = {}
    
    # 遍历字符串,统计每个字符出现的次数
    for c in s:
        if c in char_counts:
            char_counts[c] += 1
        else:
            char_counts[c] = 1
    
    # 遍历哈希表,找到第一个出现的次数为1的字符
    for i, c in enumerate(s):
        if char_counts[c] == 1:
            return i
    
    # 如果遍历完整个哈希表,没有找到这样的字符,则返回-1
    return -1


# 测试
s = "leetcode"
print(first_unique_char(s))  # 0

s = "loveleetcode"
print(first_unique_char(s))  # 2

s = "aabb"
print(first_unique_char(s))  # -1

复杂度分析

  • 时间复杂度:O(n) ,其中 n 是字符串 s 的长度。我们遍历字符串一次,并在哈希表中查找字符的时间复杂度为 O(1)
  • 空间复杂度:O(n) ,因为我们使用哈希表来存储字符和其出现的次数。

结语

本题是 leetcode 中的经典题目,考察了哈希表的使用。解决这个问题的关键是将字符的出现的次数存储在哈希表中,然后遍历哈希表找到第一个出现的次数为 1 的字符。