当前位置:首页 > 牛客 > 牛客4590题解:高效去重字符集合的C++实现(哈希表+字符串遍历)

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

17小时前

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

一、题目解读

牛客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)循环,灵活应对题目中的多案例需求。

该思路适用于需要高效去重字符的场景,是处理字符串集合问题的经典方法。



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

题目解读给定一个整数数组,我们需要找到一个中心索引,使得该索引左侧所有元素的和等于右侧所有元素的和。如果不存在这样的索引,则返回-1。中心索引的定义不包含在左右两侧的和计算中。这个问题考察对数组遍历和...

力扣2390题:移除字符串中的星号 - 栈模拟解法详解

力扣2390题:移除字符串中的星号 - 栈模拟解法详解

内容简介本文详细解析了力扣2390题"移除字符串中的星号"的高效解法。通过模拟栈操作处理字符串中的星号字符,实现了删除星号及其前一个字符的功能。文章包含完整注释代码、算法思路讲解和...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略

2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略

一、题目解读    2025年GESP七级考试中的“等价消除(洛谷P11965)”问题要求统计给定字符串中满足等价条件的子串数量。所谓“等价子串”,是指子串中所...

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

一、题目解读洛谷B3617题要求将输入的八进制字符串转换为十六进制表示。题目需处理大数场景,且对输入合法性有明确限制(长度不超过1000,仅包含0-7字符)。由于八进制与十六进制无法直接转换,需借助十...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。