C ++中子字符串的最大出现次数
假设我们有一个字符串s,我们必须找到满足以下规则的任何子字符串的最大出现次数-
子字符串中不同字符的数量必须小于或等于maxLetters。
子字符串的大小必须在minSize和maxSize(含)范围内。
因此,如果输入类似于-“aababcaab”,maxLetters=2,minSize=3并且maxSize=4,则输出将为2。子字符串“aab”在原始字符串中出现2次。这满足条件,即2个唯一字母和3号(介于minSize和maxSize之间)。
为了解决这个问题,我们将遵循以下步骤-
定义映射m
适用于介于minSize至maxSize之间的sz
如果x<=maxLetters的大小,则将m[temp]增加1
将x[temp[0]]减少1
如果x[temp[0]]为0,则从x中删除temp[0]
从临时本身中删除临时的第一和第二个元素
x[s[i]]增加1
temp:=temp+s[i]
x[s[i]]增加1
temp:=temp+s[i]
制作映射x,创建临时图,最初是空的
当我的范围是0到sz–1
当j为0时,i在sz到s–1的范围内,将i和j加1
如果x<=maxLetters的大小,则将m[temp]增加1
回答:=0
虽然映射m有一些元素,那么
ans:=ans的最大值和第i个键值对的值
返回ans
例子(C++)
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int maxFreq(string s, int maxLetters, int minSize, int maxSize) {
unordered_map <string ,int > m;
for(int sz = minSize; sz <= minSize; sz++){
unordered_map <char, int> x;
string temp ="";
for(int i = 0; i < sz; i++){
x[s[i]]++;
temp += s[i];
}
for(int j = 0, i = sz; i < s.size(); i++, j++){
if(x.size() <= maxLetters){
m[temp]++;
}
x[temp[0]]--;
if(x[temp[0]] == 0)x.erase(temp[0]);
temp.erase(temp.begin(),temp.begin() + 1);
x[s[i]]++;
temp += s[i];
}
if(x.size() <= maxLetters){
m[temp]++;
}
}
int ans = 0;
unordered_map <string ,int > :: iterator i = m.begin();
while(i != m.end()){
ans = max (ans, i->second);
i++;
}
return ans;
}
};
main(){
Solution ob;
cout << (ob.maxFreq("aababcaab",2,3,4));
}输入值
"aababcaab" 2 3 4
输出结果
2