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是字符的数量

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

队列

感觉没有任何优势的写法
387. 字符串中的第一个唯一字符_第1张图片

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

387. 字符串中的第一个唯一字符_第2张图片

你可能感兴趣的:(leetcode)