题目来源:LeetCode387:字符串中的第一个唯一字符
问题抽象: 给定一个字符串 s(仅含小写英文字母),要求找到字符串中 第一个不重复字符 的索引(索引从 0 开始),满足以下核心需求:
-
唯一性判定规则:
- 字符
c在字符串中 仅出现一次(出现频次为1); - “第一个” 指在字符串中 首次出现位置最早 的唯一字符。
- 字符
-
计算约束:
- 时间复杂度 O(n)(
n为字符串长度),空间复杂度 O(1)(固定长度数组); - 需通过 频次统计+顺序遍历 实现:
- 首次遍历统计各字符频次(数组
freq[26]); - 二次遍历查找首个频次为
1的字符索引。
- 首次遍历统计各字符频次(数组
- 时间复杂度 O(n)(
-
边界处理:
- 字符串为空 → 返回
-1; - 无唯一字符 → 返回
-1; - 特殊输入:
s="leetcode"→ 返回0(字符'l'首次出现且唯一);s="loveleetcode"→ 返回2(字符'v'首次出现且唯一);s="aabb"→ 返回-1(无唯一字符);
- 全唯一字符:
s="abc"→ 返回0(首个字符'a')。
- 字符串为空 → 返回
-
字符范围:
- 输入字符串仅包含小写字母
a-z(无需处理大写或特殊字符); - 频次数组索引:
char - 'a'(0-25)。
- 输入字符串仅包含小写字母
输入:字符串 s(长度 ≥0)。
输出:整数值(首个唯一字符的索引,不存在时返回 -1)。
解题思路
题目要求在给定字符串中找到第一个不重复的字符并返回其索引。核心思路是通过两次遍历实现:
- 第一次遍历:统计每个字符的出现频率。使用固定大小的整型数组(长度256,覆盖所有ASCII字符)存储频率,数组下标对应字符的ASCII值。
- 第二次遍历:顺序检查字符串中的每个字符,在频率数组中查找出现次数为1的字符,第一个满足条件的字符即为所求。
该方法时间复杂度为O(n),空间复杂度O(1)(固定大小数组)。
代码实现(Java版)🔥点击下载源码
class Solution {
public int firstUniqChar(String s) {
// 创建长度为256的整型数组,覆盖所有ASCII字符
int[] freq = new int[256];
// 第一次遍历:统计字符频率
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
freq[c]++; // 字符c的ASCII值作为索引,频率计数
}
// 第二次遍历:查找第一个唯一字符
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (freq[c] == 1) { // 首次遇到频率为1的字符
return i; // 返回当前索引
}
}
return -1; // 无唯一字符时返回-1
}
}
代码说明
- 频率统计:使用
freq数组记录每个字符出现次数,数组索引通过字符的ASCII值直接计算,实现O(1)时间复杂度的访问。 - 顺序查找:第二次遍历按原始字符串顺序检查字符频率,保证返回的是第一个唯一字符的索引。
- 高效性:
- 时间复杂度:O(n),n为字符串长度,两次独立遍历。
- 空间复杂度:O(1),固定使用256个整数的数组。
- 边界处理:字符串为空或不存在唯一字符时返回-1,逻辑包含在第二次遍历后的
return -1中。
提交详情(执行用时、内存消耗)

4956

被折叠的 条评论
为什么被折叠?



