LeetCode热题100-3题【滑动窗口】

3. 无重复字符的最长子串

题目描述:

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

题解:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n=s.size();
        if(n==0) return 0;
        unordered_map<char,int> mp;
        int left=0;
        int right=0;
        int ans=0;
        for(right=0;right<n;right++){
            if(mp.find(s[right])!=mp.end()){
            //当前元素在map中已存在
                left=max(left,mp[s[right]]+1);
            }
            mp[s[right]]=right;
            ans=max(ans,right-left+1);
        }
        return ans;
    }
};
 解题思路:

定义两个指针作为滑动窗口的左端和右端,初始位置均指向字符串首位元素,遍历数组移动右指针,将当前元素以及其在数组中的位置记录到map中,若遍历到一个元素在map中已存在,即说明该子字符串出现重复元素,移动左端指针到第一个不是重复元素的位置,再将该元素更新map中的当前位置。每遍历一个元素,维护一次当前子字符串的大小。

学习点:

unordered_map与map的区别:

1、实现不同

  • unordered_map底层是用哈希表实现的
  • map底层是用红黑树实现的                        

2、性能不同

  • unordered_map是不按键值排序的,插入的时间是O(logn),查询时间是O(1)
  • map是按键值排序的,插入的时间是O(logn),查询时间是O(logn)

3、使用范围不同

  • unordered_map的使用比较局限,它的key只能是int、double等基本类型以及string,而不能是自己定义的结构体
  • map可以支持所有类型的键值对

原文链接:https://blog.youkuaiyun.com/weixin_52115456/article/details/127698255 

map容器的find函数使用方法:

        用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
原文链接:https://blog.youkuaiyun.com/kupepoem/article/details/121621860

 初始版本:【运行出错】

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n=s.size();
        if(n==0) return 0;
        if(n==1) return 1;
        unordered_map<char,int> mp;
        int ans=0;
        for(int i=0;i<n;i++){
            if(mp[s[i]]==0){
                mp[s[i]]++;//将未重复元素填入map中,当前该元素出现次数为1
            }else{
                unordered_map<char,int>::iterator it=mp.find(s[i]);
                mp.erase(mp.begin(),++it);//删除重复元素以及其之前的所有元素
                mp[s[i]]++;
            }
            int m=mp.size();
            ans=max(ans,m);
        }
        return ans;
    }
};

该解题思路为将子字符串储存在map中,若出现重复字符,则从map中移除重复字符及其前面的字符。希望有缘人能给予在下该解题方法的错误原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值