📅  最后修改于: 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
解释一下上面代码的逻辑:
该算法的时间复杂度为 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
解释一下上面代码的逻辑:
该算法的时间复杂度为 O(n log n),其中 n 是字符串的长度。空间复杂度为 O(k),其中 k 是字符串中不同字符的个数。由于有序集合较大,因此排序的复杂度为 O(n log n)。
两种算法都可以求解给定字符串中的第一个非重复字符,但实现的方式截然不同。第一个算法使用哈希表进行统计,时间复杂度优于第二个算法。第二个算法则使用了有序集合,并且可以找到任意字符的最后一个位置。
根据实际情况,我们可以选择不同的算法。如果我们需要找到任意字符的最后一个位置,我们可以选择第二种算法。如果只关心第一个不重复的字符位置,第一个算法是更好的选择。