PAT 甲级 1050(字符串相减,利用哈希表)

题目大意:输入两个字符串s1,s2(长度均在10000字符以内),将在s1中的且不存在在s2中的字母按序输出。时间在100ms以内。

在这里插入图片描述

可以知道如果暴力(朴素)算法,复杂度将有 1 0 8 10^8 108,显然会超时,此时应用哈希表,其查询时间为O(1)左右,非常的快。代码如下

//
// Created by JiangNing on 2021/1/24.
//

#include"iostream"
#include "unordered_set"

using namespace std;

string s1,s2;

int main()
{
    getline(cin,s1);
    getline(cin,s2);

    unordered_set<char> hash;//哈希表插入字符
    for(auto c:s2) hash.insert(c);//将s2中的字符插入哈希表

    string res;
    for(auto c:s1)
        if(!hash.count(c))//表示未出现过
            res+=c;
    cout << res <<endl;

}

c++中的哈希表(unodered_set)

1.原理

  • set和map内部实现是基于RB-Tree,而unordered_set和unordered_map内部实现是基于哈希表。

  • unordered_set 容器类型的模板定义在 <unordered_set> 头文件中。

# include<unordered_set>
  • unordered_set 容器提供了和 unordered_map 相似的能力,但 unordered_set 可以用保存的元素作为它们自己的键。T 类型的对象在容器中的位置由它们的哈希值决定,因而需要定义一个 Hash< T > 函数。基本类型可以省去Hash< T >方法。

  • 不能存放重复元素。

  • 可指定buckets个数,可进行初始化,也可后期插入元素

std::unordered_set<string> example;
std::unordered_set<string> things {16}; // 16 buckets
std::unordered_set<string> words {"one", "two", "three", "four"};// Initializer list
std::unordered_set<string> copy_wrds {words}; // Copy constructor
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值