题解:洛谷 AT_abc426_b The Odd One Out
【题目来源】
洛谷:AT_abc426_b [ABC426B] The Odd One Out - 洛谷
【题目描述】
给定一个长度至少为 \(3\) 的字符串 \(S\),该字符串仅由小写英文字母组成。
\(S\) 恰好包含两种不同的字符,且正好有一个字符与其他字符不同。请找出那个与众不同的字符。
例如,如果 \(S\) 为 odd,请输出 o。
【输入】
输入从标准输入给出,格式如下:
\(S\)
【输出】
输出答案。
【输入样例】
odd
【输出样例】
o
【核心思想】
-
问题分析:给定长度至少为 \(3\) 的字符串 \(S\),仅包含两种不同字符,且恰好有一个字符出现一次、其余字符均出现多次。需要找出那个仅出现一次的字符。这是一个字符频率统计问题,关键在于利用
map统计每个字符出现次数,然后定位频率为 \(1\) 的字符。 -
算法选择:
- 哈希映射统计:用
map<char, int>遍历字符串统计每个字符出现频率 - 频率筛选:遍历字母表
a到z,找到第一个频率为 \(1\) 的字符即为答案
- 哈希映射统计:用
-
关键步骤:
- 读取输入:读入字符串 \(S\)
- 频率统计:遍历 \(S\) 中每个字符 \(c\),执行 \(mp[c] \mathrel{+}= 1\)
- 查找答案:按字典序遍历
char i = 'a'到'z',若 \(mp[i] = 1\) 则输出 \(i\) 并结束
-
时间/空间复杂度:
- 时间复杂度:\(O(|S| + 26)\),统计频率 \(O(|S|)\),查找答案 \(O(26)\)
- 空间复杂度:\(O(26)\),最多存储 \(26\) 个不同字符的频率
-
频率统计的核心思想:
- 多数与少数的区分:题目保证仅两种字符且一种仅出现一次,频率统计后直接筛选即可
- 字典序保证唯一性:虽然题目保证唯一答案,但按字典序遍历
a-z是一种稳健的查找策略 - 适用于"找出序列中唯一/少数元素"类问题,核心是建立频率映射表
【算法标签】
入门 #字符串入门
【代码详解】
#include <bits/stdc++.h>
using namespace std;
string s; // 存储输入的字符串
map<char, int> mp; // 字符到出现次数的映射
int main()
{
// 输入字符串
cin >> s;
// 统计每个字符的出现次数
for (int i = 0; i < s.size(); i++)
{
mp[s[i]]++; // 对应字符的计数器加1
}
// 按字母顺序查找第一个只出现一次的字符
for (char i = 'a'; i <= 'z'; i++)
{
if (mp[i] == 1) // 找到第一个出现次数为1的字符
{
cout << i << endl;
return 0; // 直接结束程序
}
}
// 如果没有找到符合条件的字符,返回0
return 0;
}
【运行结果】
odd
o
浙公网安备 33010602011771号