C++ unordered_std用法详解

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);

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值