Article / 文章
LeetCode 第387题:字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
📖 文章摘要
本文详细解析LeetCode第387题“字符串中的第一个唯一字符”,这是一道字符串处理题。文章提供了基于哈希表的解法,包含C#、Python、C++三种语言实现,配有详细的算法分析和性能对比。适合想要提升字符串处理能力的读者。
核心知识点: 字符串、哈希表、计数 难度等级: 简单 推荐人群: 具有基础算法知识,想要提升字符串处理能力的程序员
题目描述
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例
示例 1:
输入:s = "leetcode"
输出:0
示例 2:
输入:s = "loveleetcode"
输出:2
示例 3:
输入:s = "aabb"
输出:-1
提示
- 1 <= s.length <= 10^5
- s 只包含小写字母
解题思路
本题可以使用哈希表解决:
- 统计每个字符的出现次数
- 遍历字符串,找到第一个出现次数为1的字符
- 返回该字符的索引,如果不存在则返回-1
时间复杂度: O(n) 空间复杂度: O(1)
图解思路
字符统计
| 字符 | 出现次数 | 说明 |
|---|---|---|
| l | 1 | 第一个唯一字符 |
| e | 3 | 重复字符 |
| t | 1 | 唯一字符 |
| c | 1 | 唯一字符 |
| o | 1 | 唯一字符 |
| d | 1 | 唯一字符 |
处理流程
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 统计字符 | 记录每个字符出现次数 |
| 2 | 遍历字符串 | 查找第一个唯一字符 |
| 3 | 返回结果 | 返回索引或-1 |
代码实现
C# 实现
public class Solution {
public int FirstUniqChar(string s) {
int[] count = new int[26];
foreach (char c in s) {
count[c - 'a']++;
}
for (int i = 0; i < s.Length; i++) {
if (count[s[i] - 'a'] == 1) {
return i;
}
}
return -1;
}
}
Python 实现
class Solution:
def firstUniqChar(self, s: str) -> int:
count = [0] * 26
for c in s:
count[ord(c) - ord('a')] += 1
for i, c in enumerate(s):
if count[ord(c) - ord('a')] == 1:
return i
return -1
C++ 实现
class Solution {
public:
int firstUniqChar(string s) {
vector<int> count(26, 0);
for (char c : s) {
count[c - 'a']++;
}
for (int i = 0; i < s.length(); i++) {
if (count[s[i] - 'a'] == 1) {
return i;
}
}
return -1;
}
};
执行结果
C# 实现
- 执行用时:92 ms
- 内存消耗:24.8 MB
Python 实现
- 执行用时:28 ms
- 内存消耗:13.2 MB
C++ 实现
- 执行用时:4 ms
- 内存消耗:8.4 MB
性能对比
| 语言 | 执行用时 | 内存消耗 | 特点 |
|---|---|---|---|
| C++ | 4 ms | 8.4 MB | 执行效率最高,内存占用最小 |
| Python | 28 ms | 13.2 MB | 代码简洁,内存占用适中 |
| C# | 92 ms | 24.8 MB | 类型安全,内存占用较大 |
代码亮点
- 🎯 使用数组代替哈希表优化性能
- 💡 空间复杂度优化
- 🔍 处理边界情况
- 🎨 代码结构清晰,易于维护
常见错误分析
- 🚫 未使用哈希表
- 🚫 统计错误
- 🚫 边界条件处理错误
- 🚫 空间复杂度优化不足
解法对比
| 解法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 |
|---|---|---|---|---|
| 数组计数 | O(n) | O(1) | 高效,空间优 | 仅适用于小写字母 |
| 哈希表 | O(n) | O(k) | 通用 | 空间占用较大 |
相关题目
📖 系列导航
🔥 算法专题合集 - 查看完整合集
📢 关注合集更新:点击上方合集链接,关注获取最新题解!目前已更新第387题。
💬 互动交流
感谢大家耐心阅读到这里!希望这篇题解能够帮助你更好地理解和掌握这道算法题。
如果这篇文章对你有帮助,请:
- 👍 点个赞,让更多人看到这篇文章
- 📁 收藏文章,方便后续查阅复习
- 🔔 关注作者,获取更多高质量算法题解
- 💭 评论区留言,分享你的解题思路或提出疑问
你的支持是我持续分享的动力!
💡 一起进步:算法学习路上不孤单,欢迎一起交流学习!