Frequency of maximum occurring subsequence in given string
Last Updated :
12 Jul, 2025
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++
// 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
// 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
<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>
Time Complexity: O(26*N), where N is the length of the given string.
Auxiliary Space: O(M), where M = 26*26
Similar Reads
Substring of length K having maximum frequency in the given string Given a string str, the task is to find the substring of length K which occurs the maximum number of times. If more than one string occurs maximum number of times, then print the lexicographically smallest substring. Examples: Input: str = "bbbbbaaaaabbabababa", K = 5Output: ababaExplanation:The sub
14 min read
Maximum consecutive occurrences of a string in another given string Given two strings str1 and str2, the task is to count the maximum consecutive occurrences of the string str2 in the string str1. Examples: Input: str1 = âabababcbaâ, str2 = âbaâ Output: 2 Explanation: String str2 occurs consecutively in the substring { str[1], ..., str[4] }. Therefore, the maximum c
7 min read
Count subsequence of length three in a given string Given a string of length n and a subsequence of length 3. Find the total number of occurrences of the subsequence in this string. Examples : Input : string = "GFGFGYSYIOIWIN", subsequence = "GFG" Output : 4 Explanation : There are 4 such subsequences as shown: GFGFGYSYIOIWIN GFGFGYSYIOIWIN GFGFGYSYI
15 min read
Find maximum occurring character in a string Given string str. The task is to find the maximum occurring character in the string str.Examples:Input: geeksforgeeksOutput: eExplanation: 'e' occurs 4 times in the stringInput: testOutput: tExplanation: 't' occurs 2 times in the stringReturn the maximum occurring character in an input string using
8 min read
Maximum length substring with highest frequency in a string Given a string. The task is to find the maximum occurred substring with a maximum length. These occurrences can overlap. Examples: Input: str = "abab" Output: ab "a", "b", "ab" are occur 2 times. But, "ab" has maximum length Input: str = "abcd" Output: a Approach: The idea is to store the frequency
5 min read
Count of maximum occurring subsequence using only those characters whose indices are in GP Given a string S, the task is to find the count of maximum occurring subsequence P from S using only those characters whose indexes are in Geometric Progression.Note: Consider 1-based indexing in S. Examples : Input: S = "ddee"Output: 4Explanation: If we take P = "de", then P occurs 4 times in S. {
7 min read