数组-快慢指针

58 阅读1分钟

leetcode.cn/problems/mi…

  • 滑动窗口算法
/**
* @param {string} s
* @param {string} t
* @return {string}
*/
var minWindow = function(s, t) {
   const sLen = s.length
   // 构造 窗口、要求
   const window = {} 
   const need = {}  
   for(let key of t) {
       window[key] = 0
       need[key] = need[key]? (need[key]+1): 1
   }
   let valide = 0
   let left = 0, right = 0
   // 记录最小子串索引和长度
   let start = 0, len = s.length +1
   // 右移动窗口
   while (right < sLen) {
       let c = s[right]
       right++
       // 窗口内数据更新
       if (need[c]) {
          
           window[c]++
           if (window[c] === need[c]) {
               valide++
           }
       }
       // 判断窗口是否需要收缩, 移动left
       while(valide === Object.keys(need).length) {
           
           // 在这里更新最小覆盖子串
           if (right - left < len) {
               start = left
               len = right -left
           }
           let d = s[left]
           left++
           if (need[d]) {
               if (window[d] === need[d]) {
                   valide--
               }
               window[d]--
           }

       }
   }

   return len === s.length +1 ? '' : s.substr(start, len)

};

leetcode.cn/problems/fi…

/**
* @param {string} s
* @param {string} p
* @return {number[]}
*/
var findAnagrams = function(s, p) {
   let slen = s.length
   const window = {}
   const need = {}
   const result = []
   for (let key of p) {
       window[key] = 0
       need[key] = need[key] ? need[key] + 1 : 1 
   }
   let left = 0, right = 0
   let start = 0, len = slen + 1
   let validate = 0
   while (right < slen) {
       const b = s[right]
       right++
       if (need[b]) { 
           window[b] ++
           if (window[b] === need[b]) {
               validate ++ 
           }
         
           
       } 

       while(right - left >= p.length) {
           if (validate === Object.keys(need).length) {
               result.push(left)
           }
           const c = s[left]
           left ++
           if (need[c]) {
               
               if (need[c] === window[c]) {
                   validate--
               }
               window[c]--
           }
       }
   }
   return result


};