//滑动窗口算法框架 funcslidingWindow(s string, t string) { need := make(map[rune]int) window := make(map[rune]int) for _, c := range t { need[c]++ } left, right := 0, 0 valid := 0 for right < len(s) { //c是将移入窗口的字符 c := rune(s[right]) //右移窗口 right++ //进行窗口内数据的一系列更新 ...
//判断左侧窗口是否要收缩 for window needs shrink { //d是将移出窗口的字符 d := rune(s[left]) //左移窗口 left++ //进行窗口内数据的一系列更新 ... } } }
funccheckInclusion(s1 string, s2 string)bool { need := make(map[rune]int) window := make(map[rune]int) for _, c := range s1 { need[c]++ } left, right := 0, 0 valid := 0
for right < len(s2) { c := rune(s2[right]) right++ //进行窗口内数据的更新操作 if _, ok := need[c]; ok { window[c]++ if window[c] == need[c] { valid++ } } //判断左侧窗口是否要收缩 for right-left >= len(s1) { //判断是否找到了合法的子串 if valid == len(need) { returntrue } d := rune(s2[left]) left++ //进行窗口内数据的一系列更新 if _, ok := need[d]; ok { if window[d] == need[d] { valid-- } window[d]-- } } } //未找到符合条件的子串 returnfalse }
funclengthOfLongestSubstring(s string)int { window := make(map[rune]int) left, right := 0, 0 res := 0//记录结果 for right < len(s) { c := rune(s[right]) right++ //进行窗口内数据的更新 window[c]++ //判断左侧窗口是否要收缩 for window[c] > 1 { //当window[c]值大于1时,说明窗口内存在重复字符,需要收缩 d := rune(s[left]) left++ //进行窗口内数据的更新 window[d]-- } //更新答案 if right-left > res { res = right - left } } return res }
funcfindAnagrams(s string, p string) []int { need := make(map[rune]int) window := make(map[rune]int) for _, c := range p { need[c]++ }
left, right := 0, 0 valid := 0 res := []int{} //记录结果 for right < len(s) { c := rune(s[right]) right++ //进行窗口内数据的更新 if _, ok := need[c]; ok { window[c]++ if window[c] == need[c] { valid++ } } //判断左侧窗口是否要收缩 for right-left >= len(p) { //当前窗口符合条件时,把起始索引加入到res if valid == len(need) { res = append(res, left) } d := rune(s[left]) left++ //进行窗口内数据的更新 if _, ok := need[d]; ok { if window[d] == need[d] { valid-- } window[d]-- } } } return res }
classSolution { public: intminSubArrayLen(int target, vector<int>& nums){ //deque<int> window; int left=0; int right=0; int res=INT_MAX; int sum=0; while(right<nums.size()){ int c=nums[right]; right++;
//进行窗口内的更新 //window.push_back(c); sum += c; while(sum>=target){ res = min(res, right-left); int d=nums[left]; left++;
funcminSubArrayLen(target int, nums []int)int { //deque<int> window; left := 0 right := 0 res := math.MaxInt32 sum := 0 for right < len(nums) { c := nums[right] right++
//进行窗口内的更新 //window.push_back(c); sum += c for sum >= target { if right-left < res { res = right - left } d := nums[left] left++
//进行窗口内的更新 //window.pop_front(); sum -= d } } if res == math.MaxInt32 { return0 } return res }