题目:
给你一个字符串 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
}