문자열 s가 있다고 가정하고 다음 규칙을 충족하는 하위 문자열의 최대 발생 횟수를 찾아야 합니다. -
- 하위 문자열의 고유 문자 수는 maxLetters보다 작거나 같아야 합니다.
- 하위 문자열 크기는 minSize 및 maxSize 범위에 있어야 합니다.
따라서 입력이 "aababcaab", maxLetters =2, minSize =3 및 maxSize =4와 같으면 출력은 2가 됩니다. 하위 문자열 "aab"는 원래 문자열에서 2번 발생합니다. 이것은 2개의 고유한 문자와 3개의 크기(minSize와 maxSize 사이)라는 조건을 충족합니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 지도 정의
- minSize ~ maxSize 범위의 sz
- 지도 만들기 x, 임시 만들기, 처음에는 비어 있음
- 0 ~ sz – 1 범위의 i용
- x[s[i]] 1씩 증가
- temp :=temp + s[i]
- j가 0인 경우 범위 sz에서 s – 1까지의 i, i와 j를 1만큼 증가
- x <=maxLetters의 크기인 경우 m[temp]를 1 증가
- x[temp[0]] 1 감소
- x[temp[0]]가 0이면 x에서 temp[0] 삭제
- temp 자체에서 temp의 첫 번째 및 두 번째 요소 삭제
- x[s[i]] 1씩 증가
- temp :=temp + s[i]
- x <=maxLetters의 크기인 경우 m[temp]를 1 증가
- ans :=0
- map m에 몇 가지 요소가 있는 동안
- ans :=ans의 최대값과 i번째 키-값 쌍의 값
- 반환
예(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