LeetCode刷题5-3.无重复字符的最长子串

一、unordered_set

unordered_set 容器,可直译为“无序 set 容器”,即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。

总的来说,unordered_set 容器具有以下几个特性:

  1. 不再以键值对的形式存储数据,而是直接存储数据的值,即 unordered_set 存储的都是键和值相等的键值对,为了节省存储空间,该类容器在实际存储时选择只存储每个键值对的值。
  2. 容器内部存储的各个元素的值都互不相等,且不能被修改。
  3. 不会对内部存储的数据进行排序

注:使用时需包含:#include<unordered_set>
定义:unordered_set<int> a; unordered_set<char> c;
常用的成员函数:

begin()  //返回指向容器中第一个元素的正向迭代器
end()  //返回指向容器中最后一个元素之后位置的正向迭代器。
empty()	若容器为空,则返回 true;否则 falsesize()	返回当前容器中存有元素的个数。
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;
    }
};

3.时间复杂度:O(n)

4.运行结果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值