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

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

6个月前 (08-04)

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

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



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣53题:贪心策略与动态规划的完美联姻 三行代码映射算法精髓

力扣53题:贪心策略与动态规划的完美联姻 三行代码映射算法精髓

题目理解在数字的海洋中寻找最具价值的珍珠链:当我们面对一个可能包含正负数的数组时,寻找连续子数组的和最大值就像在波动的股票曲线中捕捉最佳投资时段。问题的核心在于如何处理可能降低总和的负值元素——是忍痛...

力扣654:递归分治的艺术 如何用最大元素构建二叉树

力扣654:递归分治的艺术 如何用最大元素构建二叉树

题目重解我们面对一个看似简单却充满递归魅力的题目:给定一个不含重复元素的整数数组,需要构建一棵特殊的二叉树。这个树的每个父节点都必须是当前子数组中的最大元素,而它的左右子树则分别由该最大值左侧和右侧的...

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

题目重解:数字三角形是一个经典的动态规划问题,给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们需要找到一条路径,使得路径上经过的数字总和最大。这个问题可以很...

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

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

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

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

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

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

发表评论

访客

看不清,换一张

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