算法训练营:滑动窗口的解释与构造

简介

在算法的问题中,如果构造的存储抽象为数组,那么有时会遇到一类问题:(最大长度、最小长度)的字串。
固定的滑动窗口,可以认为值一个信号量的局部采样:
信号中的滑动窗口
算法问题中,考虑的层次更为广泛:有一个大小可变的窗口,左右两端方向一致向前滑动。

假设有数组[a b c d e f g h]
一个大小为3的滑动窗口在其上滑动,则有:
[a b c]
  [b c d]
    [c d e]
      [d e f]
        [e f g]
          [f g h]

算法思想

1.采用双指针的技巧采样局部数据
2.先增加右边界,如果子序列符合要求,再固定右边界,调整左边界,判断是否符合要求
3.重复上述步骤,直到遍历完毕

算法模板

var template = function(s){
  //滑动窗口的两端
  var left = 0, right=0;
  //序列长度
  len = s.length
  slide_s=[]
  //结果
  res
  while(right<len){
    //没找到可行解-->扩大窗口 right
    //找到可行解-->更新结果值,缩小窗口left
  }

}

实战演练--3.无重复字符的最长子串

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

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
  请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成


/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    var left = 0, right = 0, maxlen=1;
    var queue = [];
    var idx = 0;
    if(s.length==0){
        return 0;
    }
    while(idx<s.length){
        if(queue.indexOf(s[idx])===-1){
            queue.push(s[idx]);
            idx++;
        }else{
           queue.splice(0,1);
        }
        maxlen = Math.max(maxlen,queue.length)
    }
    return maxlen;
};

参考文献

无重复字符的最长子串
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

实战演练--567.字符串的排列

给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false
换句话说,s1 的排列之一是 s2 的 子串 。

示例 1:
输入:s1 = "ab" s2 = "eidbaooo"
输出:true
解释:s2 包含 s1 的排列之一 ("ba").

示例 2:
输入:s1= "ab" s2 = "eidboaoo"
输出:false

提示:

1 <= s1.length, s2.length <= 104
s1 和 s2 仅包含小写字母

/**
 * @param {string} s1
 * @param {string} s2
 * @return {boolean}
 */
var checkInclusion = function(s1, s2) {
    var len_s1 = s1.length, len_s2 = s2.length;
    if(len_s1>len_s2){
        return false;
    }
    
    var cnt_s1 = new Array(26).fill(0);
    var cnt_s2 = new Array(26).fill(0);
    for(var i=0;i<len_s1;i++){
        ++cnt_s1[s1[i].charCodeAt()-'a'.charCodeAt()];
        ++cnt_s2[s2[i].charCodeAt()-'a'.charCodeAt()];    
    }
    if(cnt_s1.toString()===cnt_s2.toString()){
        return true;
    }

    for(var i=len_s1;i<len_s2;++i){
        ++cnt_s2[s2[i].charCodeAt() - 'a'.charCodeAt()];
        --cnt_s2[s2[i - len_s1].charCodeAt() - 'a'.charCodeAt()];
        if (cnt_s1.toString() === cnt_s2.toString()) {
            return true;
        }
    }
    return false;
};

参考文献

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-in-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

posted @ 2022-03-27 15:10  adminmttt  阅读(261)  评论(0编辑  收藏  举报