LeetCode 387. 字符串中的第一个唯一字符 | Python

387. 字符串中的第一个唯一字符


题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/first-unique-character-in-a-string/

题目


给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

示例:

s = "leetcode"
返回 0

s = "loveleetcode"
返回 2

**提示:**你可以假定该字符串只包含小写字母。

解题思路


思路:两次遍历(计数,存索引)

审题,题目要求在给定的字符串中,找出第一个不重复的字符,返回它的索引。若不存在,返回 − 1 -1 1

计数

题目要求不重复,那么我们首先想到的是可以通过计数的形式,通过两次遍历,找出不重复字符对应的索引。

具体的做法如下:

  • 第一次遍历,统计字符串中每个字符出现的次数;
  • 第二次遍历,判断字符出现的次数,当次数等于 1 1 1 时,返回该字符对应的索引;否则返回 − 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 的列表存储字符对应出现的次数。这里就不贴出代码,可以尝试下。

存索引

这里除了上面计数的方法之外,我们还可以通过哈希表存储索引来进行实现。

具体的思路如下:

  • 声明字典 c h _ i n d e x ch\_index ch_index,用于存储字符及对应出现的索引,键为字符,值为对应字符出现的索引;
  • 第一次遍历,遍历字符串 s s s,开始进行讨论处理:
    • 当字符存在于字典中,此时将值更改为 − 1 -1 1,用于标记重复;
    • 当字符不存在于字典中,则将该字符及字符出现的索引作为键值对存入字典中。
  • 第二次遍历,遍历字典值,找出第一个不重复字符的索引。也就是字典值中不为 − 1 -1 1 且值最小的那个。如果字典中所有值均为 − 1 -1 1,那么直接返回 − 1 -1 1

具体代码实现如下。

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

欢迎关注


公众号 【书所集录


如有错误,烦请指出,欢迎指点交流。如果觉得写得还可以,还请点个赞👍,谢谢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值