Java教程

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

本文主要是介绍滑动窗口相关题目(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版)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!