leetcode-387:字符串中的第一个唯一字符(队列以及堆栈最简单的实现方式)

LC 字符串中的第一个唯一字符

  • 题目:
  • 解题:
    • 方法一:使用哈希表存储频数
    • 方法二:使用哈希表存储索引
    • 方法三:队列

题目:

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

s = "leetcode"
返回 0

s = "loveleetcode"
返回 2

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

解题:

方法一:使用哈希表存储频数

使用了计数器Counter

class Solution:
    def firstUniqChar(self, s: str) -> int:
        frequency = collections.Counter(s)#字符串也是可以直接用Conter计数的
        for i, ch in enumerate(s):
            if frequency[ch] == 1:
                return i
        return -1

leetcode-387:字符串中的第一个唯一字符(队列以及堆栈最简单的实现方式)_第1张图片
说明:
字典中,先被放入的键在前面,即使后续被修改依旧在前面。
Conter是按键对应值大小,从大到小的排,如果值一样大, 则按照放入顺序。所以上面直接
frequency[ch] == 1就可以找到第一个唯一字符

方法二:使用哈希表存储索引

class Solution:
    def firstUniqChar(self, s: str) -> int:
        position = dict()
        n = len(s)
        for i, ch in enumerate(s):
            if ch in position:
                position[ch] = -1 #如果第二次遇到,就变成-1,因此只有出现一次的值为索引i
            else:
                position[ch] = i
        first = n
        for pos in position.values():
            if pos != -1 and pos < first:
                first = pos
        if first == n:
            first = -1
        return first

leetcode-387:字符串中的第一个唯一字符(队列以及堆栈最简单的实现方式)_第2张图片

方法三:队列

哈希表中存的都是第一次遇到字符的索引(用来判断是否只遇到过1次,如果多次的话,在队列中会顺序pop,直到遇到第一个只出现一次的字符),队列中存的是每次的字符和索引,

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]

队列:
有很多种,最简单的实现方式

queue = list()
queue.append("a")
queue.pop(0)

(上述方法三的代码完全可以用这种方式)
当然python标准库中包含了四种队列,分别是queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque

堆栈:
最简单的实现方式

stack = list()
stack.append("a")
stack.pop()

你可能感兴趣的:(算法从零开始python,队列,python,leetcode,算法,字符串)