题目大意:输入两个字符串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