1. 问题背景与核心需求
在算法面试和日常编程中,字符串处理是最基础也最常被考察的技能之一。LeetCode 387题"字符串中的第一个唯一字符"看似简单,却涵盖了哈希表、数组索引、字符编码等多个计算机科学核心概念。这道题在亚马逊、微软等大厂的初级面试中出现频率高达62%(根据2023年LeetCode企业题库统计)。
实际业务中类似的场景比比皆是:日志系统中定位首个异常事件、用户行为流中识别首个关键操作、文本处理时查找首个特殊符号等。理解这个问题的解法,能帮助我们建立处理"首个唯一性"问题的通用思维模型。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题描述与示例分析
给定一个字符串s,我们需要找到其中第一个不重复的字符,并返回它的索引。如果不存在这样的字符,则返回-1。注意字符串只包含小写字母(这是一个重要约束条件)。
示例1:
输入:s = "leetcode"
输出:0
解释:'l'是第一个唯一字符
示例2:
输入:s = "loveleetcode"
输出:2
解释:'v'是第一个唯一字符(第一个'l'和'e'都重复)
示例3:
输入:s = "aabb"
输出:-1
解释:所有字符都重复
3. 暴力解法与时间复杂度分析
最直观的解法是双重循环遍历:
python复制def firstUniqChar(s: str) -> int:
for i in range(len(s)):
is_unique = True
for j in range(len(s)):
if i != j and s[i] == s[j]:
is_unique = False
break
if is_unique:
return i
return -1
时间复杂度分析:
- 外层循环n次
- 内层循环n次
- 总时间复杂度O(n²)
空间复杂度O(1),因为没有使用额外空间。这种方法在小规模数据(n<1000)时可行,但在LeetCode测试用例中会遇到超时问题。
4. 哈希表优化解法
更高效的解法是使用哈希表(字典)存储字符频率:
python复制def firstUniqChar(s: str) -> int:
freq = {}
for char in s:
freq[char] = freq.get(char, 0) + 1
for i, char in enumerate(s):
if freq[char] == 1:
return i
return -1
时间复杂度分析:
- 第一次遍历统计频率:O(n)
- 第二次遍历查找首个唯一字符:O(n)
- 总时间复杂度O(n)
空间复杂度O(1),因为英文字母数量固定(26个),哈希表大小不会随输入增长。
注意:虽然空间复杂度标记为
