【leetcode】387. First Unique Character in a String 首个单字符

本文介绍了一种高效算法,用于查找给定字符串中第一次出现的唯一字符的位置。通过两次遍历字符串并使用数组记录字符出现次数,该算法能在O(n)时间内解决问题。
int firstUniqChar(char* s) {
    int len=strlen(s);
    int abc[26]={0};
    int i=0;
    while (i<len){
        abc[s[i]-'a']++;
        i++;
    }
    i=0;
    while (i<len){
        if (abc[s[i]-'a']==1){
            return i;
        }
        i++;
    }
    return -1;
}

http://blog.youkuaiyun.com/vlin_hao/article/details/52596431
同样也是用字母表存出字母频数。

第一次写的时候,比较笨,没有想到可以利用i来传递下标,所以在字母表数组里存下标,过程比较麻烦。

我们来用 **最基础、最清晰的方式** 解决 "First Unique Character"(第一个唯一字符)这个问题,适合刚学编程的同学。 --- ### ✅ 问题描述: 给定一个字符串,找到 **第一个只出现一次的字符**,并返回它的 **位置(从1开始)**。 如果不存在,返回 `no`。 > 样例: 输入:`abccrtca` 输出:`2` 解释:'b' 是第一个只出现一次的字母,它是第2个字符。 --- ### ✅ 思路(两步走): 1. **统计每个字母出现的次数** 2. **从左到右扫描字符串,找出第一个出现次数为1的字符** --- ### ✅ 基础 C++ 代码(使用数组计数) ```cpp #include <iostream> #include <string> using namespace std; int main() { string s; cin >> s; // 输入字符串 // 创建一个数组记录 a~z 每个字母出现了几次 int count[26] = {0}; // 全部初始化为0 // 第一步:统计每个字符出现的次数 for (int i = 0; i < s.length(); i++) { char c = s[i]; // 取出当前字符 count[c - 'a']++; // 把 'a'→0, 'b'→1, ..., 统计次数 } // 第二步:从左到右找第一个只出现一次的字符 for (int i = 0; i < s.length(); i++) { char c = s[i]; if (count[c - 'a'] == 1) { cout << i + 1 << endl; // 输出位置(从1开始) return 0; // 找到了就结束 } } // 如果没找到唯一的字符 cout << "no" << endl; return 0; } ``` --- ### 📝 详细解释: #### 🔹 `int count[26] = {0};` - 我们假设输入只有小写字母 a~z - 用 `count[0]` 表示 'a' 出现几次,`count[1]` 表示 'b'…… - 初始化为0:没人出现过 #### 🔹 统计次数: ```cpp for (int i = 0; i < s.length(); i++) { count[s[i] - 'a']++; } ``` - `'b' - 'a' = 1` → 所以 `count[1]++` - 这样就能知道每个字母总共出现了多少次 #### 🔹 查找第一个唯一字符: ```cpp if (count[c - 'a'] == 1) ``` - 再从头开始看每个字符 - 谁的计数是1,就是我们要找的! #### 🔹 `i + 1` 是因为: - 数组下标从0开始,但题目问的是“第几位” - 第1位、第2位……所以加1 --- ### ✅ 示例运行:`abccrtca` | 字符 | a | b | c | c | r | t | c | a | |------|---|---|---|---|---|---|---|---| | 位置 |1|2|3|4|5|6|7|8| 统计结果: - a:3, b:1, c:3, r:1, t:1 从左往右查: - a → 出现3次 ❌ - b → 出现1次 ✅ → 输出 `2` ✔️ 正确! --- ### ✅ 更多测试案例: | 输入 | 输出 | 说明 | |-----------|------|------| | `aabbcc` | no | 都重复 | | `abcabc` | no | 都重复 | | `abcdef` | 1 | a 是第一个唯一 | | `baaab` | 2 | 中间的 a 不算,第一个 b 是唯一的?不对! > 等等!注意:在 `baaab` 中: - b 出现了2次 → 不唯一 - 所有字母都重复 → 应该输出 `no` 再试:`leetcode` → 第一个唯一的是 `l`? l:1, e:3, t:1, c:1, o:1, d:1 → l 是第一个且唯一 → 输出 1 ✅ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值