解法一:滑动窗口
func checkInclusion(s1 string, s2 string) bool {
// 判断 s 中是否存在 t 的排列
need := make(map[rune]int)
window := make(map[rune]int)
for _, c := range s1 {
need[c]++
}
left, right := 0, 0
valid := 0 // 记录窗口内和s2的每个字母相同的次数
for right < len(s2) {
c := rune(s2[right])
right++
// 进行窗口内数据的一系列更新
if need[c] > 0 {
window[c]++
if window[c] == need[c] {
valid++
}
}
// 判断左侧窗口是否要收缩
if right-left == len(s1) {
// 在这里判断是否找到了合法的子串
if valid == len(need) {
return true
}
d := rune(s2[left]) // 待移除窗口的元素
left++
// 进行窗口内数据的一系列更新
if need[d] > 0 {
if window[d] == need[d] {
valid--
}
window[d]--
}
}
}
// 未找到符合条件的子串
return false
}