Get the best out of our app
GeeksforGeeks App
Open App
Browser
Continue

# Frequency of maximum occurring subsequence in given string

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:
Explanation:
For “aba”, subsequence “ab” occurs maximum times in subsequence ‘ab’ and ‘aba’.

Input: s = “acbab”
Output:
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++

 `// C++ program for the above approach``#include ``#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

 `// 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

 `# 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#

 `// 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`

## Javascript

 ``

Output:

`3`

Time Complexity: O(26*N), where N is the length of the given string.
Auxiliary Space: O(M), where M = 26*26

My Personal Notes arrow_drop_up