类型二:多指针滑动窗口

76 阅读2分钟

一、滑动窗口

  • 本质:固定左端点,不断枚举右端点,  不满足条件时缩短左端点
  • 题目条件:满足 单调性(数组元素都是正数)  的 子数组(数组元素连续)

二、思路

  • 关键词:

    • 涉及两个数组/字符串
    • 排列、字母异位词等
  • 难点在于

    • 定义两个map存储 比较两个map中key、value的关系

三、题目汇总

四、题解汇总

  • Code 30
func findSubstring(s string, words []string) []int {
	res:=[]int{}
	target:=map[string]int{}
	for i:=0;i<len(words);i++{
            target[words[i]]++
	}
	m:=len(words)
	n:=len(words[0])
	for i :=0; i<=(len(s)-m*n); i++{
            flag:=true
            windows:=map[string]int{}
            for k:=0;k<m;k++{
                str:=s[i+k*n:i+(k+1)*n]
                windows[str]++
                if target[str]==0 || target[str]<windows[str]{
                    flag=false
                }
            }
            if flag{
                res=append(res,i)
            }
	}
	return res
}
  • code 567
func checkInclusion(s1 string, s2 string) bool {
    if len(s1)>len(s2){
        return false
    }
    target:=map[byte]int{}
    for i:=0;i<len(s1);i++{
        target[s1[i]]++
    }
    windows:=map[byte]int{}
    for i:=0;i<len(s1);i++{
        windows[s2[i]]++
    }
    left:=0
    if checkHelper(target,windows){
        return true
    }
    for right:=len(s1);right<len(s2);right++{
        windows[s2[right]]++
        windows[s2[left]]--
        left++
        if checkHelper(windows,target){
            return true
        }
    }
    return false
}

func checkHelper(target map[byte]int, windows map[byte]int)bool{
    for k,v:=range target{
        if windows[k]!= v{
            return false
        }
    }
    return true
}
  • code 187
func findRepeatedDnaSequences(s string) []string {
    windows:=map[string]int{}
    res:=[]string{}
    for i:=0;i<=len(s)-10;i++{
        windows[s[i:i+10]]++
        if windows[s[i:i+10]]==2{
            res=append(res,s[i:i+10])
        }
    }
    return res
}
  • code 438
func checkHelperCore(target map[byte]int, windows map[byte]int)bool{
    for k,v:=range target{
        if windows[k]!= v{
            return false
        }
    }
    return true
}

func findAnagrams(s string, p string) []int {
    res:=[]int{}
    target:=map[byte]int{}
    for i:=0;i<len(p);i++{
        target[p[i]]++
    }
    windows:=map[byte]int{}
    n:=len(s)
    left:=0
    for right:=0;right<n;right++{
        windows[s[right]]++
        if right-left+1==len(p) {
            if checkHelperCore(windows,target){
                res=append(res,left)
            }
            windows[s[left]]--
            left++
        }
}
    return res
}
  • code 220
func containsNearbyAlmostDuplicate(nums []int, k int, t int) bool {
    for i:=0;i<len(nums);i++{
        for j:=i+1;j-i<=k&&j<len(nums);j++{
            if abs(nums[i],nums[j])<=t{
                return true
            }
        }
    }
    return false
}

func abs(a,b int)int{
    if a>b{
        return a-b
    }
    return b-a
}