1. 程式人生 > 其它 >演算法訓練營:滑動視窗的解釋與構造

演算法訓練營:滑動視窗的解釋與構造

簡介

在演算法的問題中,如果構造的儲存抽象為陣列,那麼有時會遇到一類問題:(最大長度、最小長度)的字串。
固定的滑動視窗,可以認為值一個訊號量的區域性取樣:

演算法問題中,考慮的層次更為廣泛:有一個大小可變的視窗,左右兩端方向一致向前滑動。

假設有陣列[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
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。