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

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

题目:

题目链接

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -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

说明:

字典中,先被放入的键在前面,即使后续被修改依旧在前面。

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

方法三:队列

哈希表中存的都是第一次遇到字符的索引(用来判断是否只遇到过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()


相关文章
|
3月前
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
119 0
Leetcode第三题(无重复字符的最长子串)
|
3月前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
41 1
|
3月前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
31 9
|
3月前
【LeetCode 24】225.用队列实现栈
【LeetCode 24】225.用队列实现栈
17 0
|
3月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
24 0
|
3月前
|
算法
【LeetCode 23】232.用栈实现队列
【LeetCode 23】232.用栈实现队列
26 0
|
3月前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
33 0
|
3月前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
27 0
|
3月前
【LeetCode 19】541.反转字符串II
【LeetCode 19】541.反转字符串II
25 0
|
3月前
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
21 0