牛客4590题解:高效去重字符集合的C++实现(哈希表+字符串遍历)

一、题目解读
牛客4590题要求处理一个字符串,输出其中所有不同的字符组成的集合(即去除重复字符后的字符集合)。题目涉及多组输入,需要依次处理每个字符串并输出其唯一字符集。核心在于快速识别并存储不同字符,避免重复输出。
二、解题思路
采用哈希表实现高效去重。思路分为两部分:
1. 字符唯一性记录:利用无序集合(unordered_set<char> seen)存储已出现的字符,通过find()方法快速判断字符是否首次出现。
2. 结果构建与输出:遍历字符串时,若字符未存在于seen中,则将其插入集合并添加到结果字符串(result),最终输出结果。
该思路时间复杂度为O(N),空间复杂度为O(N),适用于处理大规模字符串输入。
三、解题步骤
1. 定义函数printCharacterSet(),接收字符串参数s。
2. 初始化哈希表seen和结果字符串result。
3. 遍历字符串s中的每个字符:
○ 若字符c未在seen中(通过seen.find(c) == seen.end()判断),则执行以下操作:
■ 将c插入seen标记为已出现。
■ 将c追加到result末尾。
4. 输出result作为去重后的字符集合。
5. 主函数中通过while(cin >> input)循环处理多组输入,调用函数并输出结果。
四、代码与注释
#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;
// 函数:获取并输出字符串的字符集合
void printCharacterSet(const string& s) {
unordered_set<char> seen; // 用于记录已经出现过的字符
string result; // 存储结果字符集合
// 遍历字符串中的每个字符
for (char c : s) {
// 如果字符还未出现过
if (seen.find(c) == seen.end()) {
seen.insert(c); // 标记为已出现
result += c; // 添加到结果中
}
}
cout << result << endl; // 输出结果
}
int main() {
string input;
// 处理多组输入
while (cin >> input) {
printCharacterSet(input);
}
return 0;
}五、总结
本解法通过哈希表实现了字符串字符集合的快速去重,核心优势在于:
● 无序集合的常数时间查找:find()和insert()操作平均时间复杂度为O(1),大幅提升效率。
● 简洁的遍历逻辑:单次遍历即可完成去重与结果构建,无需额外排序或复杂比较。
● 多组输入处理:利用while(cin >> input)循环,灵活应对题目中的多案例需求。
该思路适用于需要高效去重字符的场景,是处理字符串集合问题的经典方法。
原创内容 转载请注明出处





