Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Maximum Number of Occurrences of a Substring in C++
Suppose we have a string s, we have to find the maximum number of occurrences of any substring that satisfies the following rules −
- The number of distinct characters in the substring must be less than or equal to maxLetters.
- The substring size must be in range minSize and maxSize inclusive.
So if the input is like − “aababcaab”, maxLetters = 2, minSize = 3 and maxSize = 4, then the output will be 2. The substring "aab" has 2 occurrences in the original string. This satisfies the conditions, 2 unique letters and size 3 (between minSize and maxSize).
To solve this, we will follow these steps −
- Define a map m
- for sz in range minSize to maxSize
- make a map x, create a temp, initially empty
- for i in range 0 to sz – 1
- increase x[s[i]] by 1
- temp := temp + s[i]
- for j is 0, i in range sz to size of s – 1, increase i and j by 1
- if size of x <= maxLetters, then increase m[temp] by 1
- decrease x[temp[0]] by 1
- if x[temp[0]] is 0, then delete temp[0] from x
- delete first and second element of temp from the temp itself
- increase x[s[i]] by 1
- temp := temp + s[i]
- if size of x <= maxLetters, then increase m[temp] by 1
- ans := 0
- while map m has some elements, then
- ans := max of ans and value of ith key-value pair
- return ans
Example(C++)
Let us see the following implementation to get a better understanding −
#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));
}
Input
"aababcaab" 2 3 4
Output
2
Advertisements