567 字符串的排列-中等

题目:

给你两个字符串 s1s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false

换句话说,s1 的排列之一是 s2子串

分析:

排列是说两个字符串中每个字符出现的次数一样。

初始化两个数组,分别记录s1和s2固定窗口中每个字符的出现次数,如果一致,则返回 true。

// date 2023/11/20
func checkInclusion(s1 string, s2 string) bool {
    n, m := len(s1), len(s2)
    if n > m {
        return false
    }
    var ct1, ct2 [26]int
    for i := range s1 {
        ct1[s1[i]-'a']++
        ct2[s2[i]-'a']++
    }
    if ct1 == ct2 {
        return true
    }

    for i := n; i < m; i++ {
        // update ct2
        ct2[s2[i]-'a']++
        ct2[s2[i-n]-'a']--
        if ct1 == ct2 {
            return true
        }
    }

    return false
}

最后更新于