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

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

1个月前 (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)循环,灵活应对题目中的多案例需求。

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



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣451:ASCII数组计数法 用128个桶解决频率排序问题

力扣451:ASCII数组计数法 用128个桶解决频率排序问题

题目重解给定一个字符串,将字符按照出现频率降序排列。例如输入"tree",可能返回"eetr"或"eert"。题目要求我们不考虑字母顺序,只...

征服力扣704题:三步掌握经典二分查找算法

征服力扣704题:三步掌握经典二分查找算法

题目重解我们面对的是算法领域最经典的二分查找问题:在一个已排序的整数数组中,快速定位目标值的位置。就像在一本按字母顺序排列的字典中查找单词,我们不需要逐页翻阅,而是通过不断折半的方式快速缩小搜索范围,...

力扣933题:队列的妙用:如何高效统计最近请求

力扣933题:队列的妙用:如何高效统计最近请求

题目重解:我们需要设计一个能统计最近3000毫秒内请求次数的系统。每当新的请求到来时,它会带有时间戳t,我们需要返回过去3000毫秒内(包括当前)发生的请求总数。这就像是在时间轴上维护一个滑动窗口,只...

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

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

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

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

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

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

力扣965题深度解析:单值二叉树的判断技巧

力扣965题深度解析:单值二叉树的判断技巧

重新解读题目 判断一棵二叉树是否为“单值二叉树”,即所有节点的值是否完全相同。题目看似简单,实则考验对树结构递归特性的理解。若一棵树的所有节点值相同,其必然满足:根节点与左右子树的值一致,且...

发表评论

访客

看不清,换一张

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