第一个唯一字符
First Unique Character
开始编码做交易系统排查的工程师在回看早盘订单流时,常常要做一个“最早唯一事件”的小探针——找出某条流里第一个整段窗口内只出现过一次的标识(trade ID、venue tag、session 标志)所在的位置。它的字符串版就是这道经典热身题:给定字符串 s,返回**第一个在 s 中只出现一次的字符**的位置。同样的“两遍扫 + 计数”模式在微观结构工具里反复出现——磁带回放里的首个唯一 trade ID、整个交易日里只路由过一次的 venue、点击流里的异常标志——把这个最干净的写法练扎实是值得的。
请实现 solution(s: str) -> int。扫描 s,返回**第一个在整段 s 中只出现一次的字符的 0 基索引**。若每个字符都重复了(或 s 为空),返回 -1。比较区分大小写。
举例:solution("leetcode") 返回 0,因为 l 是第一个只出现一次的字符。solution("loveleetcode") 返回 2,因为 l 与 o 都重复,索引 2 处的 v 才是第一个仅出现一次的字符。solution("aabb") 返回 -1,每个字符都重复了。solution("") 同样返回 -1。
参考解法是两次线性扫:第一遍用哈希表统计每个字符的出现次数;第二遍按索引顺序扫描,遇到计数为 1 的字符就返回它的索引。时间复杂度 O(n),额外空间 O(k),其中 k 是字符集大小(ASCII 最多 128)。朴素做法——对每个位置都再扫一遍剩下的字符判定唯一性——是 O(n²),在 n=10^5 时会超时。
约束条件
- 0 ≤ len(s) ≤ 10^5
- `s` 是任意可打印 ASCII 字符串(一般是小写字母,但大写字母、数字、空格、符号也都合法)
- 比较区分大小写:`'A'` 与 `'a'` 是两个不同的字符
- 返回第一个仅出现一次的字符的 **0 基索引**;若不存在(包括 `s` 为空时),返回 `-1`
样例
Case 1 · example from statement (leetcode classic)
输入: ["leetcode"]
期望: 0
字符 `l` 只出现一次,且它是第一个仅出现一次的字符(位于索引 0),返回 0。
Case 2 · example with leading repeats
输入: ["loveleetcode"]
期望: 2
`l` 与 `o` 都重复出现,索引 2 处的 `v` 是第一个仅出现一次的字符。
Case 3 · all repeated returns -1
输入: ["aabb"]
期望: -1
每个字符都至少出现两次,没有“唯一字符”,返回 -1。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · example from statement (leetcode classic)
输入: ["leetcode"]
期望: 0
字符 `l` 只出现一次,且它是第一个仅出现一次的字符(位于索引 0),返回 0。
Case 2 · example with leading repeats
输入: ["loveleetcode"]
期望: 2
`l` 与 `o` 都重复出现,索引 2 处的 `v` 是第一个仅出现一次的字符。
Case 3 · all repeated returns -1
输入: ["aabb"]
期望: -1
每个字符都至少出现两次,没有“唯一字符”,返回 -1。