演算法訓練營:滑動視窗的解釋與構造
簡介
在演算法的問題中,如果構造的儲存抽象為陣列,那麼有時會遇到一類問題:(最大長度、最小長度)的字串。
固定的滑動視窗,可以認為值一個訊號量的區域性取樣:
演算法問題中,考慮的層次更為廣泛:有一個大小可變的視窗,左右兩端方向一致向前滑動。
假設有陣列[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
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。