📌  相关文章
📜  教资会网络 | UGC-NET CS 2017 年 12 月 2 日 |问题 6(1)

📅  最后修改于: 2023-12-03 14:54:51.870000             🧑  作者: Mango

UGC-NET CS 2017 年 12 月 2 日 |问题 6

问题描述

给定一个仅由小写字母组成的字符串,找到并返回第一个不重复的字符。如果不存在,返回空格字符。

例如,对于字符串 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 格式标注好。