算法训练营:滑动窗口的解释与构造
简介
在算法的问题中,如果构造的存储抽象为数组,那么有时会遇到一类问题:(最大长度、最小长度)的字串。
固定的滑动窗口,可以认为值一个信号量的局部采样:
算法问题中,考虑的层次更为广泛:有一个大小可变的窗口,左右两端方向一致向前滑动。
假设有数组[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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。