Maximum length subsequence possible of the form R^N K^N
Last Updated :
30 Nov, 2022
Given a string containing only two characters i.e. R and K (like RRKRRKKKKK). The task is to find the maximum value of N for a subsequence possible of the form R—N times and then K—N times (i.e. of the form R^N K^N).
Note: String of k should be started after the string of R i.e. first k that would be considered for ‘K’ string must occur after the last R of the ‘R’ string in the given string. Also, the length of the resulting subsequence will be 2*N.
Examples:
Input: RRRKRRKKRRKKK
Output: 5
If we take R’s at indexes 0, 1, 2, 4, 5 and K’s at indexes 6, 7, 10, 11, 12
then we get a maximum subsequence of the form R^N K^N, where N = 5.
Input: KKKKRRRRK
Output: 1
If we take R at index 4( or 5 or 6 or 7) and K at index 8
then we get the desired subsequence with N = 1.
Approach:
- Calculate the number of R’s before a K .
- Calculate the number of K’s after a K, including that K.
- Store them in a table with a number of R’s in table[x][0] and a number of K’s in table[x][1].
- Minimum of the two gives the value of n for each K and we will the return the maximum n.
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
int find(string s)
{
int max = 0, i, j = 0, countk = 0, countr = 0;
int table[s.length()][2];
for (i = 0; i < s.length(); i++) {
if (s[i] == 'R' )
countr++;
else
table[j++][0] = countr;
}
j--;
for (i = s.length() - 1; i >= 0; i--) {
if (s[i] == 'K' ) {
countk++;
table[j--][1] = countk;
}
if (min(table[j + 1][0], table[j + 1][1]) > max)
max = min(table[j + 1][0], table[j + 1][1]);
}
return max;
}
int main()
{
string s = "RKRRRKKRRKKKKRR" ;
int n = find(s);
cout<<(n);
}
|
Java
public class gfg {
int find(String s)
{
int max = 0 , i, j = 0 , countk = 0 , countr = 0 ;
int table[][] = new int [s.length()][ 2 ];
for (i = 0 ; i < s.length(); i++) {
if (s.charAt(i) == 'R' )
countr++;
else
table[j++][ 0 ] = countr;
}
j--;
for (i = s.length() - 1 ; i >= 0 ; i--) {
if (s.charAt(i) == 'K' ) {
countk++;
table[j--][ 1 ] = countk;
}
if (Math.min(table[j + 1 ][ 0 ], table[j + 1 ][ 1 ]) > max)
max = Math.min(table[j + 1 ][ 0 ], table[j + 1 ][ 1 ]);
}
return max;
}
public static void main(String srgs[])
{
String s = "RKRRRKKRRKKKKRR" ;
gfg ob = new gfg();
int n = ob.find(s);
System.out.println(n);
}
}
|
Python3
def find(s):
Max = j = countk = countr = 0
table = [[ 0 , 0 ] for i in range ( len (s))]
for i in range ( 0 , len (s)):
if s[i] = = 'R' :
countr + = 1
else :
table[j][ 0 ] = countr
j + = 1
j - = 1
for i in range ( len (s) - 1 , - 1 , - 1 ):
if s[i] = = 'K' :
countk + = 1
table[j][ 1 ] = countk
j - = 1
if min (table[j + 1 ][ 0 ], table[j + 1 ][ 1 ]) > Max :
Max = min (table[j + 1 ][ 0 ], table[j + 1 ][ 1 ])
return Max
if __name__ = = "__main__" :
s = "RKRRRKKRRKKKKRR"
print (find(s))
|
C#
using System;
class GFG
{
static int find(String s)
{
int max = 0, i, j = 0,
countk = 0, countr = 0;
int [,]table= new int [s.Length, 2];
for (i = 0; i < s.Length; i++)
{
if (s[i] == 'R' )
countr++;
else
table[(j++),0] = countr;
}
j--;
for (i = s.Length - 1; i >= 0; i--)
{
if (s[i] == 'K' )
{
countk++;
table[j--, 1] = countk;
}
if (Math.Min(table[j + 1, 0],
table[j + 1, 1]) > max)
max = Math.Min(table[j + 1, 0],
table[j + 1, 1]);
}
return max;
}
static public void Main(String []srgs)
{
String s = "RKRRRKKRRKKKKRR" ;
int n = find(s);
Console.WriteLine(n);
}
}
|
Javascript
<script>
function find(s)
{
let max = 0, i, j = 0, countk = 0, countr = 0;
let table = new Array(s.length);
for (let i=0;i<s.length;i++)
{
table[i]= new Array(2);
}
for (i = 0; i < s.length; i++) {
if (s[i] == 'R ')
countr++;
else
table[j++][0] = countr;
}
j--;
// Count no. Of K' s after a K
for (i = s.length - 1; i >= 0; i--) {
if (s[i] == 'K' ) {
countk++;
table[j--][1] = countk;
}
if (Math.min(table[j + 1][0], table[j + 1][1]) > max)
max = Math.min(table[j + 1][0], table[j + 1][1]);
}
return max;
}
let s = "RKRRRKKRRKKKKRR" ;
let n=find(s);
document.write(n);
</script>
|
Time Complexity: O(n) where n is the length of the given string.
Auxiliary Space: O(n)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...