📌  相关文章
📜  给定一个字符串,找到它的第一个非重复字符(1)

📅  最后修改于: 2023-12-03 14:56:52.713000             🧑  作者: Mango

找到字符串中的第一个非重复字符

本文将介绍如何实现一个可以找到给定字符串中第一个非重复字符的算法。我们将讨论两种不同的解决方案,并比较其优缺点。

方法一:遍历统计次数

我们可以使用一个哈希表来统计每个字符在字符串中出现的次数。然后我们再次遍历该字符串,并找到第一个出现次数为 1 的字符。

下面是 Python 代码实现:

def first_uniq_char(s: str) -> int:
    freq = {}
    for c in s:
        freq[c] = freq.get(c, 0) + 1

    for i, c in enumerate(s):
        if freq[c] == 1:
            return i

    return -1

解释一下上面代码的逻辑:

  • 首先遍历字符串 s,统计每个字符出现的次数,将其存储到一个哈希表 freq 中。
  • 然后再次遍历 s,找到第一个出现次数为 1 的字符,并返回其下标。如果没有找到,返回 -1。

该算法的时间复杂度为 O(n),其中 n 是字符串的长度。空间复杂度为 O(k),其中 k 是字符串中不同字符的个数。

方法二:利用有序集合

我们可以使用一个有序集合(例如 Python 的 OrderedDict)来存储每个字符在字符串中出现的位置。然后我们找到第一个只出现一次的位置即可。

下面是 Python 代码实现:

from collections import OrderedDict

def first_uniq_char(s: str) -> int:
    d = OrderedDict()
    for i, c in enumerate(s):
        d[c] = d.get(c, []) + [i]

    for k, v in d.items():
        if len(v) == 1:
            return v[0]

    return -1

解释一下上面代码的逻辑:

  • 首先使用一个有序集合 d 来存储每个字符在字符串中出现的位置。
  • 然后遍历 d,找到第一个只出现一次的位置,并返回其下标。如果没有找到,返回 -1。

该算法的时间复杂度为 O(n log n),其中 n 是字符串的长度。空间复杂度为 O(k),其中 k 是字符串中不同字符的个数。由于有序集合较大,因此排序的复杂度为 O(n log n)。

总结

两种算法都可以求解给定字符串中的第一个非重复字符,但实现的方式截然不同。第一个算法使用哈希表进行统计,时间复杂度优于第二个算法。第二个算法则使用了有序集合,并且可以找到任意字符的最后一个位置。

根据实际情况,我们可以选择不同的算法。如果我们需要找到任意字符的最后一个位置,我们可以选择第二种算法。如果只关心第一个不重复的字符位置,第一个算法是更好的选择。