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

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

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

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



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣119题:从O(n²)到O(2n):杨辉三角高效空间优化

力扣119题:从O(n²)到O(2n):杨辉三角高效空间优化

题目重解:给定一个非负索引 rowIndex,返回杨辉三角的第 rowIndex 行。不同于生成整个杨辉三角,这道题要求我们只返回特定行,且空间复杂度应尽可能优化。例如输入3,需要返回[1,3,3,1...

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

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

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

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

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

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

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

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

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

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

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

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

发表评论

访客

看不清,换一张

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