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

哈希

遍历两趟字符串

class Solution:
    def firstUniqChar(self, s: str) -> int:
        ans = 0
        mp = Counter(s) 
        for i,ch in enumerate(s):
            if mp[ch] == 1:
                return i
        return -1  

时间复杂度 O ( n ) O(n) O(n)
空间复杂度 O ( ∣ s ∣ ) O(|s|) O(s) ∣ s ∣ |s| s是字符的数量

改进哈希

遍历一趟字符串,第二趟遍历hash table

class Solution:
    def firstUniqChar(self, s: str) -> int:
        ans = 0
        mp = dict()
        for i,ch in enumerate(s):
            if ch in mp:
                mp[ch] = -1
            else:
                mp[ch] = i

        for k,v in mp.items():
            if v!=-1:
                return v
        return -1  

因为python里dict的key是按照加入顺序构成的,所以可以直接便利

时间复杂度 O ( n ) O(n) O(n)
空间复杂度 O ( ∣ s ∣ ) O(|s|) O(s) ∣ s ∣ |s| s是字符的数量

相比遍历两次字符串,效率更高

队列

感觉没有任何优势的写法
在这里插入图片描述

class Solution:
    def firstUniqChar(self, s: str) -> int:
        position = dict()
        q = collections.deque()
        n = len(s)
        for i, ch in enumerate(s):
            if ch not in position:
                position[ch] = i
                q.append((s[i], i))
            else:
                position[ch] = -1
                while q and position[q[0][0]] == -1:
                    q.popleft()
        return -1 if not q else q[0][1]

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/first-unique-character-in-a-string/solution/zi-fu-chuan-zhong-de-di-yi-ge-wei-yi-zi-x9rok/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值