1 条题解
-
0
📝 题目大意
给定一个长度为 的字符串 (仅含小写字母),找出 中恰好出现一次的任意字符并输出;若所有字符都出现超过一次,则输出 。
💡 解题思路
-
题目分析:字符串长度固定为 ,只有小写字母,数据规模极小。本质上是一个简单的字符频率统计问题。隐藏条件:若存在多个只出现一次的字符,输出任意一个即可。
-
算法推导:
- 使用一个大小为 的整型数组
cnt(覆盖所有 ASCII 字符,直接以字符 ASCII 码作为下标)统计每个字符的出现次数。 - 第一遍遍历字符串 ,对每个字符
c执行cnt[c]++完成频率统计。 - 第二遍遍历字符串 ,按原顺序检查每个字符:若
cnt[c] == 1,说明该字符仅出现一次,直接输出并return 0结束程序。 - 若两遍遍历后仍未找到,说明所有字符均重复出现,输出 。
- 使用一个大小为 的整型数组
-
边界与细节:
- 字符串长度恒为 ,不存在空串。三种情况:三个字符各不相同(如
abc,每个都出现一次,输出第一个a);恰好两个相同(如pop,o出现一次,输出o);三个全部相同(如xxx,无唯一字符,输出 )。 - 数组大小 足够覆盖所有小写字母的 ASCII 码,无需映射到 ~。
- 注意
cnt数组需初始化为 (使用int cnt[256]={0}即可)。
- 字符串长度恒为 ,不存在空串。三种情况:三个字符各不相同(如
⏱️ 复杂度分析
- 时间复杂度:,其中 ,两遍遍历,常数级。
- 空间复杂度:,
cnt数组大小为常数 。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main(){ string s; cin >> s; // 统计每个字符的出现次数,ASCII码作为下标 int cnt[256] = {0}; for(char c : s){ cnt[c]++; } // 按原字符串顺序遍历,找到第一个出现次数为1的字符 for(char c : s) { if(cnt[c] == 1) { cout << c << endl; return 0; } } // 没有唯一字符,输出-1 cout << -1 << endl; return 0; } -
- 1
信息
- ID
- 614
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者