给你一个字符串 s
,请你返回满足以下条件且出现次数最大的 任意 子串的出现次数:
- 子串中不同字母的数目必须小于等于
maxLetters
。 - 子串的长度必须大于等于
minSize
且小于等于maxSize
。
示例 1:
输入:s = "aababcaab", maxLetters = 2, minSize = 3, maxSize = 4
输出:2
解释:子串 "aab" 在原字符串中出现了 2 次。
它满足所有的要求:2 个不同的字母,长度为 3 (在 minSize 和 maxSize 范围内)。
示例 2:
输入:s = "aaaa", maxLetters = 1, minSize = 3, maxSize = 3
输出:2
解释:子串 "aaa" 在原字符串中出现了 2 次,且它们有重叠部分。
示例 3:
输入:s = "aabcabcab", maxLetters = 2, minSize = 2, maxSize = 3
输出:3
示例 4:
输入:s = "abcde", maxLetters = 2, minSize = 3, maxSize = 3
输出:0
提示:
1 <= s.length <= 10^5
1 <= maxLetters <= 26
1 <= minSize <= maxSize <= min(26, s.length)
s
只包含小写英文字母。
C++
class Solution {
public:
int maxFreq(string s, int maxLetters, int minSize, int maxSize)
{
int res=0;
map<char,int> tmp;
map<string,int> vec;
for(int i=0;i<minSize;i++)
{
if(0==tmp[s[i]])
{
res++;
}
tmp[s[i]]++;
}
if(res<=maxLetters)
{
string str=s.substr(0,minSize);
vec[str]++;
}
for(int i=minSize;i<s.size();i++)
{
int start=i-minSize;
if(1==tmp[s[start]])
{
res--;
}
tmp[s[start]]--;
if(0==tmp[s[i]])
{
res++;
}
tmp[s[i]]++;
if(res<=maxLetters)
{
string str=s.substr(start+1,minSize);
vec[str]++;
}
}
int ans=0;
for(auto it:vec)
{
ans=max(ans,it.second);
}
return ans;
}
};