题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/first-unique-character-in-a-string/
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
s = "leetcode"
返回 0
s = "loveleetcode"
返回 2
**提示:**你可以假定该字符串只包含小写字母。
审题,题目要求在给定的字符串中,找出第一个不重复的字符,返回它的索引。若不存在,返回 − 1 -1 −1。
题目要求不重复,那么我们首先想到的是可以通过计数的形式,通过两次遍历,找出不重复字符对应的索引。
具体的做法如下:
具体代码实现如下。
class Solution:
def firstUniqChar(self, s: str) -> int:
ch_count = collections.defaultdict(int)
for ch in s:
ch_count[ch] += 1
for idx, ch in enumerate(s):
if ch_count[ch] == 1:
return idx
return -1
因为提示说明可以假设字符串中只含有小写字母,那么这里也可以直接声明一个长度为 26 26 26 的列表存储字符对应出现的次数。这里就不贴出代码,可以尝试下。
这里除了上面计数的方法之外,我们还可以通过哈希表存储索引来进行实现。
具体的思路如下:
具体代码实现如下。
class Solution:
def firstUniqChar(self, s: str) -> int:
ch_index = {}
# 第一次遍历,存储字符及对应的索引
# 如果出现重复,那么将对应的值更改为 -1
# 否则将字符及对应的索引作为键值对存入字典中
for idx, ch in enumerate(s):
if ch in ch_index:
ch_index[ch] = -1
else:
ch_index[ch] = idx
n = len(s)
first = n
# 第二次遍历,查找字典值中不为 -1 且值最小的索引
# 维护更新 first,
for idx in ch_index.values():
if idx != -1 and idx < first:
first = idx
if first == n:
return -1
return first
公众号 【书所集录】
如有错误,烦请指出,欢迎指点交流。如果觉得写得还可以,还请点个赞,谢谢。