LeetCode567 字符串的排列

37 阅读1分钟

leetcode.cn/problems/pe…

image.png

解法一:滑动窗口

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
}