Given string str, the task is to count the maximum number of possible operations that can be performed on str. An operation consists of taking a sub-sequence ‘gks’ from the string and removing it from the string.
Examples:
Input: str = “ggkssk”
Output: 1
Explanation: After 1st operation: str = “gsk”
No further operation can be performed.Input: str = “kgs”
Output: 0
Approach:
- Take three variables g, gk, and gks which will store the occurrence of the sub-sequences ‘g’, ‘gk’, and ‘gks’ respectively.
- Traverse the string character by character:
- If str[i] = ‘g’ then update g = g + 1.
- If str[i] = ‘k’ and g > 0 then update g = g – 1 and gk = gk + 1 as previously found ‘g’ now contributes to the sub-sequence ‘gk’ along with the current ‘k’.
- Similarly, if str[i] = ‘s’ and gk > 0 then update gk = gk – 1 and gks = gks + 1.
- Print the value of gks in the end.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std;
// Function to return max possible operation // of the given type that can be performed on str int maxOperations(string str)
{ int i, g, gk, gks;
i = g = gk = gks = 0;
for (i = 0; i < str.length(); i++) {
if (str[i] == 'g' ) {
// Increment count of sub-sequence 'g'
g++;
}
else if (str[i] == 'k' ) {
// Increment count of sub-sequence 'gk'
// if 'g' is available
if (g > 0) {
g--;
gk++;
}
}
else if (str[i] == 's' ) {
// Increment count of sub-sequence 'gks'
// if sub-sequence 'gk' appeared previously
if (gk > 0) {
gk--;
gks++;
}
}
}
// Return the count of sub-sequence 'gks'
return gks;
} // Driver code int main()
{ string a = "ggkssk" ;
cout << maxOperations(a);
return 0;
} |
Java
// Java implementation of the approach class GFG
{ // Function to return max possible // operation of the given type that // can be performed on str static int maxOperations(String str)
{ int i, g, gk, gks;
i = g = gk = gks = 0 ;
for (i = 0 ; i < str.length(); i++)
{
if (str.charAt(i) == 'g' )
{
// Increment count of sub-sequence 'g'
g++;
}
else if (str.charAt(i) == 'k' )
{
// Increment count of sub-sequence 'gk'
// if 'g' is available
if (g > 0 ) {
g--;
gk++;
}
}
else if (str.charAt(i) == 's' )
{
// Increment count of sub-sequence 'gks'
// if sub-sequence 'gk' appeared previously
if (gk > 0 )
{
gk--;
gks++;
}
}
}
// Return the count of sub-sequence 'gks'
return gks;
} // Driver code public static void main(String args[])
{ String a = "ggkssk" ;
System.out.print(maxOperations(a));
} } // This code is contributed // by Akanksha Rai |
Python 3
# Python 3 implementation of the approach # Function to return max possible operation # of the given type that can be performed # on str def maxOperations( str ):
i, g, gk, gks = 0 , 0 , 0 , 0
for i in range ( len ( str )) :
if ( str [i] = = 'g' ) :
# Increment count of sub-sequence 'g'
g + = 1
elif ( str [i] = = 'k' ) :
# Increment count of sub-sequence
# 'gk', if 'g' is available
if (g > 0 ) :
g - = 1
gk + = 1
elif ( str [i] = = 's' ) :
# Increment count of sub-sequence 'gks'
# if sub-sequence 'gk' appeared previously
if (gk > 0 ) :
gk - = 1
gks + = 1
# Return the count of sub-sequence 'gks'
return gks
# Driver code if __name__ = = "__main__" :
a = "ggkssk"
print (maxOperations(a))
# This code is contributed by ita_c |
C#
// C# implementation of the approach using System ;
public class GFG{
// Function to return max possible operation
// of the given type that can be performed on str
static int maxOperations( string str)
{
int i, g, gk, gks;
i = g = gk = gks = 0;
for (i = 0; i < str.Length; i++) {
if (str[i] == 'g' ) {
// Increment count of sub-sequence 'g'
g++;
}
else if (str[i] == 'k' ) {
// Increment count of sub-sequence 'gk'
// if 'g' is available
if (g > 0) {
g--;
gk++;
}
}
else if (str[i] == 's' ) {
// Increment count of sub-sequence 'gks'
// if sub-sequence 'gk' appeared previously
if (gk > 0) {
gk--;
gks++;
}
}
}
// Return the count of sub-sequence 'gks'
return gks;
}
// Driver code
public static void Main()
{
string a = "ggkssk" ;
Console.WriteLine(maxOperations(a)) ;
}
} |
PHP
<?php // PHP implementation of the approach // Function to return max possible operation // of the given type that can be performed on str function maxOperations( $str )
{ $i = $g = $gk = $gks = 0;
for ( $i = 0; $i < strlen ( $str ); $i ++)
{
if ( $str [ $i ] == 'g' )
{
// Increment count of sub-sequence 'g'
$g ++;
}
else if ( $str [ $i ] == 'k' )
{
// Increment count of sub-sequence 'gk'
// if 'g' is available
if ( $g > 0)
{
$g --;
$gk ++;
}
}
else if ( $str [ $i ] == 's' )
{
// Increment count of sub-sequence 'gks'
// if sub-sequence 'gk' appeared previously
if ( $gk > 0)
{
$gk --;
$gks ++;
}
}
}
// Return the count of sub-sequence 'gks'
return $gks ;
} // Driver code $a = "ggkssk" ;
echo maxOperations( $a );
// This code is contributed // by Akanksha Rai ?> |
Javascript
<script> // Javascript implementation of the approach // Function to return max possible // operation of the given type that // can be performed on str function maxOperations(str)
{ let i, g, gk, gks;
i = g = gk = gks = 0;
for (i = 0; i < str.length; i++)
{
if (str[i] == 'g' )
{
// Increment count of sub-sequence 'g'
g++;
}
else if (str[i] == 'k' )
{
// Increment count of sub-sequence 'gk'
// if 'g' is available
if (g > 0) {
g--;
gk++;
}
}
else if (str[i] == 's' )
{
// Increment count of sub-sequence 'gks'
// if sub-sequence 'gk' appeared previously
if (gk > 0)
{
gk--;
gks++;
}
}
}
// Return the count of sub-sequence 'gks'
return gks;
} // Driver code let a = "ggkssk" ;
document.write(maxOperations(a)); // This code is contributed by avanitrachhadiya2155 </script> |
Output
1
Time Complexity: O(n)
Auxiliary Space: O(1)