1297. 子串的最大出现次数

143 阅读1分钟

题目:
给你一个字符串 s ,请你返回满足以下条件且出现次数最大的 任意 子串的出现次数:

  • 子串中不同字母的数目必须小于等于 maxLetters 。
  • 子串的长度必须大于等于 minSize 且小于等于 maxSize 。

算法:

方法一:滑动窗口
maxSize是无用的,满足maxSize的子串,必然满足minSize

func maxFreq(s string, maxLetters int, minSize int, maxSize int) int {
    ans := 0
    subStrCount := make(map[string]int)
    charCount := make([]int, 26)
    distinctCharCount := 0
    for left, right :=0, 0; right < len(s); right ++ {
        charCount[s[right]  - 'a'] ++
        if charCount[s[right] - 'a'] == 1 {
            distinctCharCount ++
        }

        // 不符合条件了,要进行左移
        for distinctCharCount > maxLetters || right - left + 1 > minSize {
            charCount[s[left] - 'a'] --
            if charCount[s[left] - 'a'] == 0 {
                distinctCharCount --
            }
            left ++

        }

        // 左移之后判断是否子串满足条件,满足则子串次数加1
        if distinctCharCount <= maxLetters && right - left + 1 == minSize {
            substr := s[left:right + 1]
             subStrCount[substr] ++
            if subStrCount[substr] > ans {
                ans = subStrCount[substr]
            }
        }
    }
    return ans
}