【Leetcode 热题 HOT 100】无重复字符的最长子串

目录

题目及链接

 滑动窗口算法

 算法优化

代码实现

类似题目


 

题目及链接

原题链接:力扣

 滑动窗口算法

为了求最长无重复字符串的,在这里我们可以用滑动窗口算法,这个在各大笔试面试中考到的频率还是比较高的,那么什么是滑动窗口算法,我们以这道题为例,来对该算法进行详细的讲解,首先我们应该明白,其实这道题我们可以利用双指针进行判定,我们可以选择一个位置,把这个位置的值和出现的次数,用unorded_map记录下来,当遍历到下一个值的时候,我们先把其插入到我们的unordered_map中,然后通过映射来看它这个位置的值的次数,如果其出现次数大于1,那么我们就从开头开始把数据移除(推动窗口),直到移除到重复的字符的下标位置,然后记录当前长度(注意,当前长度就是最大以i下标最为结束的最大无重复字符串的长度),然后更新最大值即可。

 算法优化

在这里,如果想要优化这个算法,其实最主要的是依靠单调性来进行优化,我们在这里可以做一步判定,i向某一位置的下一个位置移动时位置的时候,j可不能能在原来j的左边?

 

 如果i'和j'之间的字符串是无重复的,那么i和j就不是最大的字串,和我们前面是矛盾的,那么j就不可能出现在之前位置的左边,这样我们下一次出现的时候直接从当前位置往后加即可,减少了一定的时间复杂度,算法就得到了优化。

代码实现

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
       unordered_map <char,int> heap;
       int ans =0;
       for(int i =0,j=0;i<s.size();i++)
       {
           heap[s[i]]++;
           while(heap[s[i]]>1)  heap[s[j++]]--;
           int len =i-j+1;
           ans =max(ans,len);
       }
       return ans;
    }
};

类似题目

力扣

完全相同的原理,不过多解释了,直接上代码 

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
       int ans =INT_MAX;
       int sum =0;
       for(int i =0,j=0;i<nums.size();i++)
       {
          sum+=nums[i];
          while(sum-nums[j]>=target){
              sum-=nums[j++];
          }
          if(sum>=target) {
              int len =i-j+1;
              ans=min(ans,len);
       }
    }
    if (ans ==INT_MAX) return 0;
    return ans;
    }
};

 

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值