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()


相关文章
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
608 0
Leetcode第三题(无重复字符的最长子串)
|
8月前
|
Go 索引
【LeetCode 热题100】394:字符串解码(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 394:字符串解码。题目要求对编码字符串如 `k[encoded_string]` 进行解码,其中 `encoded_string` 需重复 `k` 次。文章提供了两种解法:使用栈模拟和递归 DFS,并附有 Go 语言实现代码。栈解法通过数字栈与字符串栈记录状态,适合迭代;递归解法则利用函数调用处理嵌套结构,代码更简洁。两者时间复杂度均为 O(n),但递归需注意栈深度问题。文章还总结了解题注意事项及适用场景,帮助读者更好地掌握字符串嵌套解析技巧。
218 6
|
9月前
|
存储 机器学习/深度学习 缓存
🚀 力扣热题 394:字符串解码(详细解析)(Go语言版)
文章提供了两种解法:栈结构和递归解法。栈解法通过维护数字栈与字符串栈,依次处理 `[` 和 `]`,构造解码结果;递归解法则利用函数调用逐层解析嵌套结构。两者时间复杂度均为 $O(n)$,空间复杂度也为 $O(n)$。栈解法直观易懂,适合初学者;递归解法优雅简洁,适合处理深度嵌套规则。掌握这两种方法,可灵活应对类似问题,提升解题能力。
306 11
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
124 9
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
172 1
【LeetCode 24】225.用队列实现栈
【LeetCode 24】225.用队列实现栈
98 0
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
182 0
|
算法
【LeetCode 23】232.用栈实现队列
【LeetCode 23】232.用栈实现队列
98 0
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
141 0
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
120 0