leetcode上大概10道滑动窗口题目,难度为medium/hard
模板:
思路:
模板:
/* 滑动窗口算法框架 */void slidingWindow(string s, string t) {unordered_map<char, int> need, window;for (char c : t) need[c]++;int left = 0, right = 0;int valid = 0;while (right < s.size()) {// c 是将移入窗口的字符char c = s[right];// 右移窗口right++;// 进行窗口内数据的一系列更新.../*** debug 输出的位置 ***/printf("window: [%d, %d)\n", left, right);/********************/// 判断左侧窗口是否要收缩while (window needs shrink) {// d 是将移出窗口的字符char d = s[left];// 左移窗口left++;// 进行窗口内数据的一系列更新...}}}
例题
经典题目问题1:最小子串

function minWindow(str,target){let need = {},window={};for(let t of target){need[t] = need[t]++}//valid变量的设置!!!let left = 0,right=0,valid=0;//len长度的设置!!!let start=0,len = Number.Max_Integer;while(right<str.length){let s = str[right];right++;if(need[s]){window[s]++if(window[s]===need[s]){valid++;}}while(valid===Object.keys().length){//取start len的值,此处非常巧妙!!!!保证了最小长度if(right-left<len){start = left;len = right-left;}const c = str[left];left++;if(need[c]){if(window[c]===need[d]){valid--;window[c]--;}}}}return len==Number.Max_Integer?'':str.substring(start,len);}
问题2:字符串排列

// 判断 s 中是否存在 t 的排列bool checkInclusion(string t, string s) {unordered_map<char, int> need, window;for (char c : t) need[c]++;int left = 0, right = 0;int valid = 0;while (right < s.size()) {char c = s[right];right++;// 进行窗口内数据的一系列更新if (need.count(c)) {window[c]++;if (window[c] == need[c])valid++;}// 判断左侧窗口是否要收缩while (right - left >= t.size()) {// 在这里判断是否找到了合法的子串if (valid == need.size())return true;char d = s[left];left++;// 进行窗口内数据的一系列更新if (need.count(d)) {if (window[d] == need[d])valid--;window[d]--;}}}// 未找到符合条件的子串return false;}
疑问:如果如果字母不相邻怎么办?
问题3:找所以字母异位词

问题4:最长无重复子串


