Table of Contents
Problem Statement :
Maximum Number of Occurrences of a Substring Leetcode Solution – Given a string s, return the maximum number of occurrences of any substring under the following rules:
- The number of unique characters in the substring must be less than or equal to maxLetters.
- The substring size must be between minSize and maxSize inclusive.
Example :
Example 1
Input: s = "aababcaab", maxLetters = 2, minSize = 3, maxSize = 4 Output: 2 Explanation: Substring "aab" has 2 ocurrences in the original string. It satisfies the conditions, 2 unique letters and size 3 (between minSize and maxSize).
Example 2
Input: s = "aaaa", maxLetters = 1, minSize = 3, maxSize = 3 Output: 2 Explanation: Substring "aaa" occur 2 times in the string. It can overlap.
Constraints :
Observation :
- In the given problem, we have to return the maximum number of occurrences of any substring that obeys the given rules.
- Our most basic approach will be to check occurrences of substrings of minSize to maxSize and count their occurrences using a map.
- If we look closely, each occurrence of a substring with a length more than minSize will actually encompass a string of minSize itself, therefore we just need to check and count the frequency of minSize substrings.
- So, we can easily use a sliding window of that size and check for the constraints within that window.
- Checking for rules in the current substring can be done in O(n) by using a hashmap to store the unique count of characters in the window.
- The key here is to understand that we don’t need to care about maxSize.
Algorithm :
- First, we’ll initialize two frequency maps. One map ( freqMap ) will store the character frequency of String s and through this character frequency map we will check the unique character constraint, and the other will store the string frequency (ansFreqMap).
- We will use two pointers i and j, i will help us to acquire the characters of s, and j will help us to release the characters of s.
- Now, run a loop to create a window of size minSize-1 and put the characters in the freqMap.
- Now, run the second loop, in this loop, we will acquire a character of s by acquiring pointer (i) and store that character in freqMap.
- After acquiring a character we have a window of minSize so we will check that our current substring follows the unique letter constraint ( The number of unique characters in the substring must be less than or equal to maxLetters ).
- If the current substring follows all the given rules then we will store the substring in ansFreqMap.
- Now increment the releasing pointer ( j ) and release the character where releasing pointer ( j ) points from freqMap
- At last, we will find the max frequency of substring present in the ansFreqMap.
Code for Maximum Number of Occurrences of a Substring :
Java Code
//no of uq ch <=maxLetters //length of minsize<=sub>=maxsize class Solution { public int maxFreq(String s, int maxLetters, int minSize, int maxSize) { int n=s.length(); Map<Character,Integer>freqMap=new HashMap<>(); Map<String,Integer>ansFreqMap=new HashMap<>(); int countOfUniqueChar=0; int ans=0; int i=0; int j=-1; for(;i<minSize-1;i++){ char ch=s.charAt(i); freqMap.put(ch,freqMap.getOrDefault(ch,0)+1); } i--; while(i<n-1){ i++; char ch=s.charAt(i); freqMap.put(ch,freqMap.getOrDefault(ch,0)+1); countOfUniqueChar=freqMap.size(); if(countOfUniqueChar<=maxLetters){ String sub= s.substring(j+1,i+1); ansFreqMap.put(sub,ansFreqMap.getOrDefault(sub,0)+1); } j++; ch=s.charAt(j); freqMap.put(ch,freqMap.get(ch)-1); if(freqMap.get(ch)==0)freqMap.remove(ch); } for(String key:ansFreqMap.keySet()){ int freqVal=ansFreqMap.get(key); ans=Math.max(ans,freqVal); } return ans; } }
C++ Code
class Solution { public: int maxFreq(string s, int maxLetters, int minSize, int maxSize) { int n=s.size(); // To store frequency of characters in string s unordered_map<char,int>freqMap; // To store Substring of string s with given constraint of size minSize unordered_map<string,int>ansFreqMap; //tells us about unique characters in string s int countOfUniqueChar=0; int ans=0; // i -> for acquiring int i=0; //j->for relasing int j=-1; // acquire till less than minsize-1 for(;i<minSize-1;i++){ char ch=s[i]; freqMap[ch]++; } i--; //now make the minSize window by acquring and relasing while(i<n-1){ i++; char ch=s[i]; freqMap[ch]++; countOfUniqueChar=freqMap.size(); if(countOfUniqueChar<=maxLetters){ string sub= s.substr(j+1,i-j); ansFreqMap[sub]++; } j++; ch=s[j]; freqMap[ch]--; if(freqMap[ch]==0)freqMap.erase(ch); } for(auto key:ansFreqMap){ int freqVal=key.second; ans=max(ans,freqVal); //cout<<key.first<<" "<<key.second<<endl; } //cout<<ansFreqMap.size()<<endl; return ans; } };
Complexity Analysis for Maximum Number of Occurrences of a Substring Leetcode Solution
Time Complexity
O(n), where n is the length of the string
Space Complexity
O(n).