题解
找出没出现过的字母
1 条题解
-
0
解题思路
小写字母一共只有 a~z 这 26 个。我们准备一个长度为 26 的标记数组 used:
读到哪个字母,就把 used[那个字母的编号] 标记成 true,表示这个字母出现过了。字母 a 对应下标 0,b 对应 1,……,z 对应 25,也就是用 c - 'a' 把字母转成下标。
最后按字母表顺序 a、b、c……逐个检查:凡是标记还是 false 的,就是没出现过的字母,把它们依次输出。
题目保证一定存在没出现过的字母,所以输出不会为空。
参考代码
// 找出没出现过的字母:用标记数组记录哪些小写字母出现过,再输出没出现过的 #include <iostream> using namespace std; bool used[26]; int main() { int n; cin >> n; for (int i = 0; i < n; i++) { char c; cin >> c; used[c - 'a'] = true; // 把出现过的字母标记上 } bool first = true; for (int i = 0; i < 26; i++) { // 按a~z顺序检查 if (!used[i]) { // 没出现过就输出 if (!first) cout << ' '; cout << char('a' + i); first = false; } } cout << endl; return 0; }复杂度分析
读入 n 个字母需要 O(n),最后检查 26 个字母是常数时间,总时间复杂度 O(n)。标记数组固定 26 个格子,空间复杂度 O(1)。
- 1