C++ 11中对unordered_set描述大体如下:无序集合容器是一个存储唯一的关联容器。
它是基于哈希表实现的,感兴趣可以自行了解一下,在这里就不多展开了,注意的是无序set的键值和其内容值是一样的,我们不能修改其内容,但是可以插入元素或者删除元素。
其特点是通常可以在常数时间进行插入,删除和查找。
**
定义
**
unordered_set<char> re;
在这里我定义的是一个储存字符类型的无序容器,注意的是要申明类型和记得加头文件"#include<unordered_set>"
基本操作
1.find() 查找元素
re.find(1);
在容器中查找1,如果能找到,则返回迭代器
如果找不到,则返回unordered_set::end()
2. insert() 插入元素
re.insert(1);
往容器中插入一个元素1,如果重复就不会进行操作
3. erase() 删除元素
re.erase(1);
删除元素1
4 .clear() 清空容器
re.clear();
清楚容器内所有元素
6.size() 返回容器的大小
re.size();
返回一个int型值
7.count函数
re.count(2);
容器中有要查询的数2就返回1,没有就返回0
**
解决问题
**
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
实现思想:
对字符串从头到尾进行遍历,无需容器每次插入不同长度的字符串,每次少一个,当容器出现重复的时候,就根据重复数字的位置更换我的遍历区间,每次算出来的区间长度进行对比,输出最大值。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> re; //定义一个无需容器
int cout1=0,cout2=0,ans=0;
for(int i=0;i<s.length();i++){
int m=i;
re.clear(); //每次for循环开始前清空容器内的值
while(re.count(s[m])==0&&m<s.length()){ //容器内进行多次插入
re.insert(s[m]);//第一次全插入,第二次从字符串第二个开始,第三次从第三个开始......
m++;
}
if(ans<re.size()) ans=re.size(); //比较大小,保留最大值
}
return ans;}
};
时间复杂度分析
左和右分别会遍历整个字符串一次,所以复杂度是O(n);
空间复杂度分析
额外开辟了无序容器,所以空间复杂度为O(n);