返回

用 Python 轻松解决 LC 387:找出字符串中的第一个唯一字符

见解分享

引言

LeetCode 387 题“第一个唯一字符”要求我们给定一个字符串,找出其中第一个出现的不重复的字符,并返回其下标。这道算法题看似简单,但需要我们巧妙地运用数据结构和算法知识。本文将深入解析 LC 387 算法,并提供一个用 Python 实现的清晰简洁的解决方案。

算法解析

解决 LC 387 算法的关键在于利用适当的数据结构来高效地存储和检索字符及其出现频率。以下步骤阐述了我们的算法流程:

  1. 创建哈希表: 我们将使用一个哈希表来存储字符串中的每个唯一字符及其出现的次数。
  2. 遍历字符串: 我们遍历给定字符串中的每个字符。
  3. 更新哈希表: 对于每个字符,我们检查它是否已经存在于哈希表中。如果是,则增加其出现次数;否则,将其添加到哈希表中,并将出现次数设为 1。
  4. 寻找第一个唯一字符: 遍历哈希表,找到出现次数为 1 的第一个字符。
  5. 返回下标: 返回此唯一字符在字符串中的下标。

Python 实现

以下 Python 代码实现了上述算法:

def first_unique_char(s):
  """
  Finds the index of the first unique character in a string.

  Args:
    s (str): The input string.

  Returns:
    int: The index of the first unique character, or -1 if no unique character is found.
  """

  # Create a hash table to store character counts.
  char_counts = {}

  # Traverse the string and update the hash table.
  for char in s:
    if char in char_counts:
      char_counts[char] += 1
    else:
      char_counts[char] = 1

  # Find the first character with a count of 1.
  for i, char in enumerate(s):
    if char_counts[char] == 1:
      return i

  # No unique character found.
  return -1

示例

考虑输入字符串 s = "leetcode"。算法将执行以下步骤:

  • 创建哈希表:{'l': 1, 'e': 1, 'e': 2, 't': 1, 'c': 1, 'o': 1, 'd': 1}
  • 遍历哈希表,找到出现次数为 1 的第一个字符:l
  • 返回下标:0

因此,对于字符串 "leetcode", 算法返回 0,表示第一个唯一字符 'l' 的下标。

其他技巧

除了使用哈希表外,还可以使用以下技巧来提高算法的效率:

  • 利用有序字典: 使用有序字典可以按字符出现的顺序存储字符,从而避免额外的遍历步骤。
  • 避免重复遍历: 一旦找到第一个唯一字符,就可以停止遍历字符串。
  • 考虑特殊情况: 算法应该处理空字符串和只包含重复字符的情况。

总结

LC 387 算法是一个经典的字符串处理问题,可以通过使用哈希表和巧妙的算法策略来有效解决。本文提供了算法的详细解析和 Python 实现,并介绍了提高算法效率的实用技巧。通过掌握这些概念,程序员可以自信地解决类似的算法问题。