返回
每日一练(23):从字符串中找到第一个只出现一次的字符
后端
2023-10-25 03:15:04
问题
给定一个字符串 s
,找到 第一个只出现一次的字符 ,并返回它的 索引 。
如果 没有 这样的字符,返回 -1
。
示例 1:
输入:s = "leetcode"
输出:0
示例 2:
输入:s = "loveleetcode"
输出:2
示例 3:
输入:s = "aabb"
输出:-1
提示:
0 <= s.length <= 50000
s
由小写和大写英文字母和空格组成。
解决方案
我们可以使用哈希表来解决这个问题。哈希表中存储字符和其出现的次数。然后遍历字符串,如果遇到哈希表中没有的字符,则返回该字符的索引。如果遍历完整个字符串,哈希表中没有这样的字符,则返回 -1
。
以下是详细的实现步骤:
- 创建一个哈希表,将每个字符作为键,其出现的次数作为值。
- 遍历字符串
s
中的每个字符c
。 - 如果哈希表中没有字符
c
,则将其添加到哈希表中,并将其出现的次数设置为1
。 - 否则,将哈希表中字符
c
出现的次数增加1
。 - 遍历哈希表,找到第一个出现的次数为
1
的字符c
,并返回其索引。 - 如果遍历完整个哈希表,没有找到这样的字符,则返回
-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
的字符。