一、unordered_set
unordered_set 容器,可直译为“无序 set 容器”,即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。
总的来说,unordered_set 容器具有以下几个特性:
- 不再以键值对的形式存储数据,而是直接存储数据的值,即 unordered_set 存储的都是键和值相等的键值对,为了节省存储空间,该类容器在实际存储时选择只存储每个键值对的值。
- 容器内部存储的各个元素的值都互不相等,且不能被修改。
- 不会对内部存储的数据进行排序
注:使用时需包含:#include<unordered_set>
定义:unordered_set<int> a; unordered_set<char> c;
常用的成员函数:
begin() //返回指向容器中第一个元素的正向迭代器
end() //返回指向容器中最后一个元素之后位置的正向迭代器。
empty() 若容器为空,则返回 true;否则 false。
size() 返回当前容器中存有元素的个数。
max_size() 返回容器所能容纳元素的最大个数,不同的操作系统,其返回值亦不相同。
find(key) 查找以值为 key 的元素,如果找到,则返回一个指向该元素的正向迭代器;反之,则返回一个指向容器中最后一个元素之后位置的迭代器(如果 end() 方法返回的迭代器)。
count(key) 在容器中查找值为 key 的元素的个数。
insert() 向容器中添加新元素。
erase() 删除指定元素。
clear() 清空容器,即删除容器中存储的所有元素。
swap() 交换 2 个 unordered_set 容器存储的元素,前提是必须保证这 2 个容器的类型完全相等。
二、该题目算法
1.算法描述
- 主要用到滑动窗口的思想,窗口的边界分别为 l 和 r
- 开始时l=r=0,之后向set中添加字符;
- 若此时添加的字符未在set中出现,set.fine(该字符)会返回set.end(),那么此时将该元素添加到set中,并更新最大长度,滑动窗口增大,r向前移
- 若此时添加的字符在set中有过,则将 l所指元素删除,滑动窗口变小,l向前移
- 重复上述3.4步骤直到 l和r指向字符串末尾
2.代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size()==0) return 0;
unordered_set<char> a;
int l=0,r=0;
int cnt=1;
while(l<s.size()&&r<s.size()){
if(a.find(s[r])==a.end()){ //在a中没找到重复的
//查找以值为 key 的元素,如果没找到,则返回一个指向容器中最后一个元素之后位置的迭代器
a.insert(s[r]); //将该值加入set
r++; //后移后指针
cnt=max(cnt,r-l); //更新最大窗口值
cout<<cnt<<" ";
}
else{ //找到重复的,则后移滑动窗口
a.erase(s[l]);
l++;
}
}
return cnt;
}
};