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