1 条题解
-
0
📝 题目大意
给定一个仅由小写英文字母组成的字符串 (长度 ),找出出现次数最多的字符。若存在并列,则输出字母序最小的那个。
💡 解题思路
- 题目分析:字符串仅包含 26 个小写字母,长度最多 1000,直接开一个大小为 26 的计数数组统计即可,无需任何优化。
- 算法推导:
- 用
cnt[26]数组,下标 对应'a', 对应'z'。 - 遍历字符串 ,对每个字符 执行
cnt[c - 'a']++统计频率。 - 初始化
maxCount = 0,ans = 'a'。 - 按 (即从
'a'到'z')遍历cnt数组:- 当
cnt[i] > maxCount(严格大于)时才更新maxCount和ans。
- 当
- 输出
ans。
- 用
- 边界与细节:
- 使用
>而非>=是关键:由于按字母序从小到大遍历,当后续字符出现次数与当前最大值相等时不会更新,从而自然保证"并列时取字母序最小"。 - 若用
>=则会输出字母序最大的那个,导致 WA。 - 字符串长度至少为 ,无需考虑空串的特殊情况。
- 使用
⏱️ 复杂度分析
- 时间复杂度:,遍历字符串一次,再遍历固定大小的 26 个桶。
- 空间复杂度:,仅需一个大小为 26 的数组。
💻 标准代码 (C++)
#include <iostream> #include <string> #include <vector> using namespace std; int main() { string S; cin >> S; // 统计 26 个小写字母的出现次数,下标 0 对应 'a' vector<int> cnt(26, 0); for (char c : S) { cnt[c - 'a']++; } int maxCount = 0; char ans = 'a'; // 按字母序从小到大遍历,只有严格大于才更新,保证并列时取字母序最小 for (int i = 0; i < 26; i++) { if (cnt[i] > maxCount) { maxCount = cnt[i]; ans = 'a' + i; } } cout << ans << endl; return 0; }
- 1
信息
- ID
- 772
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者