滑动窗口相关题目(java版和js版)

Posted 每天都要喝白开水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了滑动窗口相关题目(java版和js版)相关的知识,希望对你有一定的参考价值。

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

找出从每一个字符开始的,不包含重复字符的最长子串。
image
思路:

  • 1.创建一个set
  • 2.两个指针(不要被这个名词吓到)第一个指向字符串的开头j, 第二个随着for循环遍历字符串i。
  • 3.如果set里没有s[j],说明目前为止还没有重复的字符,把s[i]添加到set里,然后更新最大不重复字符的数量。
  • 4.如果set里有s[i],则从set里开始删除s[j],并且j递增,再检查set里是否有s[i],如此反复直到set里没有s[i]为止,while循环结束后,再将当前的s[i]加进去
  • 5.重复步骤3和4,直到遍历完整个字符串j

其实可以这样理解,两个指针维护的就是一个窗口,我们需要做的就是保证在这个窗口里面,没有重复字符。在while循环中删除了set[j]还是为了在当前窗口中没有重复的字符串。当然此时右边的指针i是不用移动的,因为前面都已经判断出了[j,i]区域的字符串是不重复的。如果一直遇见ccccccc这种重复的,滑动窗口大小始终为1,ij指针重合。

java

class Solution {
    public int lengthOfLongestSubstring(String s) {
        HashSet<Character> set=new HashSet<>();
        int maxLength=0;
        int j=0;
        if(s.length()==0){
            return 0;
        }
        for(int i=0;i<s.length();i++){
            if(!set.contains(s.charAt(i))){
                set.add(s.charAt(i));
                //加入新的元素,则窗口往后面移动一格
                maxLength=Math.max(maxLength,set.size());
            }else{
                while(set.contains(s.charAt(i))){
                    //移动左边的指针
                    set.remove(s.charAt(j));
                    j++;
                }
                //删除后要加上新的set中没有的字符
                set.add(s.charAt(i));
            }
        }
        return maxLength;
    }
}

image
滑动窗口还有更优雅的做法

javascript

var lengthOfLongestSubstring = function(s) {
    let set=new Set();
    let i=0,j=0,maxLength=0;
    if(s.length===0){
        return 0;
    }
    for(i;i<s.length;i++){
        if(!set.has(s[i])){
            set.add(s[i]);
            maxLength=Math.max(maxLength,set.size)
        }else{
            while(set.has(s[i])){
                set.delete(s[j]);
                j++;
            }
            set.add(s[i]);
        }
    }
    return maxLength;
};

set 的操作 add delete

以上是关于滑动窗口相关题目(java版和js版)的主要内容,如果未能解决你的问题,请参考以下文章

Java 求解滑动窗口最大值

java刷题--239滑动窗口最大值

剑指 Offer 59 - I. 滑动窗口的最大值 c++/java详细题解

剑指 Offer 59 - I. 滑动窗口的最大值 c++/java详细题解

精选力扣500题 第69题 239. 滑动窗口最大值c++/java详细题解

剑指Offer(Java版)第六十七题:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口