一、滑动窗口
- 本质:固定左端点,不断枚举右端点, 不满足条件时缩短左端点。
- 题目条件:满足 单调性(数组元素都是正数) 的 子数组(数组元素连续) 。
二、思路
-
关键词:
- 涉及两个数组/字符串
- 排列、字母异位词等
-
难点在于
- 定义两个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
}