📅  最后修改于: 2023-12-03 14:54:51.870000             🧑  作者: Mango
给定一个仅由小写字母组成的字符串,找到并返回第一个不重复的字符。如果不存在,返回空格字符。
例如,对于字符串 leetcode
,第一次出现不重复的字符是 l
,返回 l
;对于字符串 loveleetcode
,第一次出现不重复的字符是 v
,返回 v
。
首先,很明显可以使用哈希表来统计每个字符出现的次数,然后再遍历字符串找到第一个出现次数为 1 的字符。
具体实现时,可以先遍历一遍字符串,用哈希表记录每个字符出现的次数。然后再遍历一遍字符串,找到第一个出现次数为 1 的字符。
时间复杂度为 O(n),空间复杂度为 O(n),其中 n 为字符串长度。
可以利用队列维护字符出现的顺序,以及哈希表统计每个字符出现的次数。
对于每个新出现的字符,如果其出现次数为 1,则将其加入队列尾部;否则在队列中将其对应的节点删去。当需要找到第一个不重复的字符时,只需要判断队列头部元素的出现次数是否为 1 即可。
时间复杂度为 O(n),空间复杂度为 O(n),其中 n 为字符串长度。
class Solution:
def firstUniqChar(self, s: str) -> str:
# 字符计数器
counter = {}
# 统计每个字符出现的次数
for c in s:
counter[c] = counter.get(c, 0) + 1
# 遍历字符串
for c in s:
# 找到第一个出现次数为 1 的字符
if counter[c] == 1:
return c
# 没有出现次数为 1 的字符,返回空格
return ' '
from collections import deque
class Solution:
def firstUniqChar(self, s: str) -> str:
# 字符计数器
counter = {}
# 维护唯一字符队列
queue = deque()
# 遍历字符串
for c in s:
# 更新字符计数器
counter[c] = counter.get(c, 0) + 1
# 添加唯一字符到队列
if counter[c] == 1:
queue.append(c)
# 删除重复字符
else:
while queue and counter[queue[0]] > 1:
queue.popleft()
# 队列头部即第一个不重复字符
return queue[0] if queue else ' '
以上代码片段已经按 markdown 格式标注好。