Given a string str of lowercase English alphabets, our task is to find the frequency of occurrence a subsequence of the string which occurs the maximum times.
Examples:
Input: s = “aba”
Output: 2
Explanation:
For “aba”, subsequence “ab” occurs maximum times in subsequence ‘ab’ and ‘aba’.Input: s = “acbab”
Output: 3
Explanation:
For “acbab”, “ab” occurs 3 times which is the maximum.
Approach: The problem can be solved using Dynamic Programming. To solve the problem mentioned above the key observation is that the resultant subsequence will be of length 1 or 2 because frequency of any subsequence of length > 2 will be lower than the subsequence of length 1 or 2 as they are also present in higher length subsequences. So we need to check for the subsequence of length 1 or 2 only. Below are the steps:
- For length 1 count the frequency of each alphabet in the string.
- For length 2 form a 2D array dp[26][26], where dp[i][j] tells frequency of string of char(‘a’ + i) + char(‘a’ + j).
- The recurrence relation is used in the step 2 is given by:
dp[i][j] = dp[i][j] + freq[i]
where,
freq[i] = frequency of character char(‘a’ + i)
dp[i][j] = frequency of string formed by current_character + char(‘a’ + i).
- The maximum of frequency array and array dp[][] gives the maximum count of any subsequence in the given string.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> #define ll long long using namespace std;
// Function to find the frequency ll findCount(string s) { // freq stores frequency of each
// english lowercase character
ll freq[26];
// dp[i][j] stores the count of
// subsequence with 'a' + i
// and 'a' + j character
ll dp[26][26];
memset (freq, 0, sizeof freq);
// Initialize dp to 0
memset (dp, 0, sizeof dp);
for ( int i = 0; i < s.size(); ++i) {
for ( int j = 0; j < 26; j++) {
// Increment the count of
// subsequence j and s[i]
dp[j][s[i] - 'a' ] += freq[j];
}
// Update the frequency array
freq[s[i] - 'a' ]++;
}
ll ans = 0;
// For 1 length subsequence
for ( int i = 0; i < 26; i++)
ans = max(freq[i], ans);
// For 2 length subsequence
for ( int i = 0; i < 26; i++) {
for ( int j = 0; j < 26; j++) {
ans = max(dp[i][j], ans);
}
}
// Return the final result
return ans;
} // Driver Code int main()
{ // Given string str
string str = "acbab" ;
// Function Call
cout << findCount(str);
return 0;
} |
// Java program for the above approach class GFG{
// Function to find the frequency static int findCount(String s)
{ // freq stores frequency of each
// english lowercase character
int []freq = new int [ 26 ];
// dp[i][j] stores the count of
// subsequence with 'a' + i
// and 'a' + j character
int [][]dp = new int [ 26 ][ 26 ];
for ( int i = 0 ; i < s.length(); ++i)
{
for ( int j = 0 ; j < 26 ; j++)
{
// Increment the count of
// subsequence j and s[i]
dp[j][s.charAt(i) - 'a' ] += freq[j];
}
// Update the frequency array
freq[s.charAt(i) - 'a' ]++;
}
int ans = 0 ;
// For 1 length subsequence
for ( int i = 0 ; i < 26 ; i++)
ans = Math.max(freq[i], ans);
// For 2 length subsequence
for ( int i = 0 ; i < 26 ; i++)
{
for ( int j = 0 ; j < 26 ; j++)
{
ans = Math.max(dp[i][j], ans);
}
}
// Return the final result
return ans;
} // Driver Code public static void main(String[] args)
{ // Given String str
String str = "acbab" ;
// Function call
System.out.print(findCount(str));
} } // This code is contributed by amal kumar choubey |
# Python3 program for the above approach import numpy
# Function to find the frequency def findCount(s):
# freq stores frequency of each
# english lowercase character
freq = [ 0 ] * 26
# dp[i][j] stores the count of
# subsequence with 'a' + i
# and 'a' + j character
dp = [[ 0 ] * 26 ] * 26
freq = numpy.zeros( 26 )
dp = numpy.zeros([ 26 , 26 ])
for i in range ( 0 , len (s)):
for j in range ( 26 ):
# Increment the count of
# subsequence j and s[i]
dp[j][ ord (s[i]) - ord ( 'a' )] + = freq[j]
# Update the frequency array
freq[ ord (s[i]) - ord ( 'a' )] + = 1
ans = 0
# For 1 length subsequence
for i in range ( 26 ):
ans = max (freq[i], ans)
# For 2 length subsequence
for i in range ( 0 , 26 ):
for j in range ( 0 , 26 ):
ans = max (dp[i][j], ans)
# Return the final result
return int (ans)
# Driver Code # Given string str str = "acbab"
# Function call print (findCount( str ))
# This code is contributed by sanjoy_62 |
// C# program for the above approach using System;
class GFG{
// Function to find the frequency static int findCount(String s)
{ // freq stores frequency of each
// english lowercase character
int []freq = new int [26];
// dp[i,j] stores the count of
// subsequence with 'a' + i
// and 'a' + j character
int [,]dp = new int [26, 26];
for ( int i = 0; i < s.Length; ++i)
{
for ( int j = 0; j < 26; j++)
{
// Increment the count of
// subsequence j and s[i]
dp[j, s[i] - 'a' ] += freq[j];
}
// Update the frequency array
freq[s[i] - 'a' ]++;
}
int ans = 0;
// For 1 length subsequence
for ( int i = 0; i < 26; i++)
ans = Math.Max(freq[i], ans);
// For 2 length subsequence
for ( int i = 0; i < 26; i++)
{
for ( int j = 0; j < 26; j++)
{
ans = Math.Max(dp[i, j], ans);
}
}
// Return the readonly result
return ans;
} // Driver Code public static void Main(String[] args)
{ // Given String str
String str = "acbab" ;
// Function call
Console.Write(findCount(str));
} } // This code is contributed by Rajput-Ji |
<script> // JavaScript program for the above approach // Function to find the frequency function findCount(s)
{ // freq stores frequency of each
// english lowercase character
var freq = Array(26).fill(0);
// dp[i][j] stores the count of
// subsequence with 'a' + i
// and 'a' + j character
var dp = Array.from(Array(26), ()=>Array(26).fill(0));
for ( var i = 0; i < s.length; ++i) {
for ( var j = 0; j < 26; j++) {
// Increment the count of
// subsequence j and s[i]
dp[j][s[i].charCodeAt(0) -
'a' .charCodeAt(0)] += freq[j];
}
// Update the frequency array
freq[s[i].charCodeAt(0) - 'a' .charCodeAt(0)]++;
}
var ans = 0;
// For 1 length subsequence
for ( var i = 0; i < 26; i++)
ans = Math.max(freq[i], ans);
// For 2 length subsequence
for ( var i = 0; i < 26; i++) {
for ( var j = 0; j < 26; j++) {
ans = Math.max(dp[i][j], ans);
}
}
// Return the final result
return ans;
} // Driver Code // Given string str var str = "acbab" ;
// Function Call document.write( findCount(str)); </script> |
3
Time Complexity: O(26*N), where N is the length of the given string.
Auxiliary Space: O(M), where M = 26*26