剑指 Offer 50. 第一个只出现一次的字符
Posted 炫云云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 50. 第一个只出现一次的字符相关的知识,希望对你有一定的参考价值。
剑指 Offer 50. 第一个只出现一次的字符
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例:
s = "abaccdeff"
返回 "b"
s = ""
返回 " "
限制:
0 <= s 的长度 <= 50000
哈希表
思路与算法
我们可以对字符串进行两次遍历。
在第一次遍历时,我们使用哈希映射统计出字符串中每个字符出现的次数。在第二次遍历时,我们只要遍历到了一个只出现一次的字符,那么就返回该字符,否则在遍历结束后返回空格。
复杂度分析
时间复杂度: O ( n ) O(n) O(n) ,其中 n n n 是字符串 s s s 的长度。我们需要进行两次遍历。
空间复杂度: O ( ∣ Σ ∣ ) O(|\\Sigma|) O(∣Σ∣) ,其中 Σ \\Sigma Σ 是字符集,在本题中 s s s 只包含小写字母,因此 ∣ Σ ∣ ≤ 26 |\\Sigma| \\leq 26 ∣Σ∣≤26 。我们需要 O ( ∣ Σ ∣ ) O(|\\Sigma|) O(∣Σ∣)的空间存储哈希映射。
class Solution(object):
def firstUniqChar(self, s):
"""
:type s: str
:rtype: str
"""
frequency = collections.Counter(s)
for i , ch in enumerate(s):
if frequency[ch] ==1:
return ch
return ' '
class Solution(object):
def firstUniqChar(self, s):
"""
:type s: str
:rtype: str
"""
dic = {}
for c in s:
dic[c] = not c in dic
for c in s:
if dic[c]:
return c
return ' '
Python 代码中的 not c in dic 整体为一个布尔值; c in dic 为判断字典中是否含有键 c 。
哈希表存储索引
思路与算法
我们可以对方法一进行修改,使得第二次遍历的对象从字符串变为哈希映射。
具体地,对于哈希映射中的每一个键值对,键表示一个字符,值表示它的首次出现的索引(如果该字符只出现一次)或者 − 1 -1 −1(如果该字符出现多次)。当我们第一次遍历字符串时,设当前遍历到的字符为 c c c,如果 c c c 不在哈希映射中,我们就将 c c c与它的索引作为一个键值对加入哈希映射中,否则我们将 c c c 在哈希映射中对应的值修改为 -1。
在第一次遍历结束后,我们只需要再遍历一次哈希映射中的所有值,找出其中不为 -1的最小值,即为第一个不重复字符的索引,然后返回该索引对应的字符。如果哈希映射中的所有值均为 -1,我们就返回空格。
class Solution(object):
def firstUniqChar(self, s):
"""
:type s: str
:rtype: str
"""
position = dict()
n = len(s)
for i ,ch in enumerate(s):
if ch in position:
position[ch] = -1
else:
position[ch] = i
first = n
for pos in position.values():# 遍历值
if pos != -1 and pos < first:
first = pos
return " " if first == n else s[first]
参考
以上是关于剑指 Offer 50. 第一个只出现一次的字符的主要内容,如果未能解决你的问题,请参考以下文章