滑动窗口与哈希表使用

leecode题目:3. 无重复字符的最长子串 - 力扣(LeetCode)

依循滑动窗口的经典思路,首先我先定义左右边框,l=0,r=0,接着就是判断的条件问题,如何才能找到一个符合条件的区间,并统计到最大的区间长度。

面对滑动窗口的问题,我们首先要考虑两种情况·,第一是在l与r构成的区间里面没有重复的字符时,应该满足扩张的要求,先将r对应位置的字符包含在哈希表之中,同时更新最大区间长度,此时r应该右移,而当该区间在扩张后,刚好包含了一对重复的字符,应该怎么办?第一种考虑是移动r,如果向右移动,原先包含在区间内的重复字符始终存在,不符合要求,向左移动只会使区间重复原来的路,开倒车,由此可知只能移动l。至于l很明显只能往右边移动,并且随着移动,将离开区间的字符应该同时剔除哈希表。至此,便是解决此题的全部思路了。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int r=0,l=0;
        int max=0,len=0;
        unordered_map mp;
        for(;r=max){
                max=len;
            }
        }
        return max;
    }
};

但是我思考了几个问题:

第一如何确定自己的算法一定能找到最大的符合条件的区间的长度呢?

首先,试想在我们区间扩张到第一次出现重复字符,我们应该得到了从初始左端点截至右端点的最长区间长度,此时我们还有可能延续遍历过的区间吗?可能,但是那个区间必定要截断,否则是不会符合条件的,也就是说,如果有可能出现比原区间更大的区间,但是左侧一定会截短,而且是尽可能大得短。也就是说,我们其实遍历了所有可能比原始区间尽可能大的区间,答案绝对正确。

第二怎么计算时间复杂度呢?

该数组的字符每个都会被右端点遍历一次,而左端点的移动并不会回退(这也是与暴力枚举的很大不同)致使每个字符也最多被其遍历一次,因此时间复杂度就是O(N)强于暴力枚举

你可能感兴趣的:(数据结构,leetcode,C++,滑动窗口,哈希表)