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
              GFGFGYSYIOIWIN
              GFGFGYSYIOIWIN

Input : string = "GFGGGZZYNOIWIN", 
        subsequence = "GFG"
Output : 3

Brute Force Approach: The simplest way to solve this problem is to run three loops for the tree characters of the given subsequences. That is start a loop to find the first character of the subsequence in the string , once this character is found start a loop after this index to find the second character, once this character is found start a loop after this index to find the third character. Maintain a variable to store the number of occurrences of third character, i.e. number of occurrences of the subsequence.

Below is the implementation of above approach:

C

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find number of occurrences of
// a subsequence of length 3
#include<iostream>
using namespace std;
  
// Function to find number of occurrences of
// a subsequence of length three in a string
int findOccurrences(string str, string substr)
{    
    // variable to store no of occurrences
    int counter = 0;
  
    // loop to find first character
    for (int i=0;i<str.length();i++)
    {
        if (str[i]==substr[0])
        {    
            // loop to find 2nd character
            for (int j=i+1;j<str.length();j++)
            {
                if (str[j]==substr[1])
                {    
                    // loop to find 3rd character
                    for (int k = j+1; k<str.length(); k++)
                    {    
                        // increment count if subsequence 
                        // is found
                        if (str[k]==substr[2])
                            counter++;
                    }
                }
            }
        }
    }
  
    return counter;
}
  
// Driver code
int main()
{
    string str = "GFGFGYSYIOIWIN";
    string substr = "GFG";
    cout << findOccurrences(str, substr);    
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find number of occurrences of
// a subsequence of length 3
import java.util.*;
import java.lang.*;
  
public class GfG{
      
    // Function to find number of occurrences of
    // a subsequence of length three in a string
    public static int findOccurrences(String str1, String substr1)
    
        // variable to store no of occurrences
        int counter = 0;
          
        char[] str = str1.toCharArray();
        char[] substr = substr1.toCharArray();
          
        // loop to find first character
        for (int i=0; i < str1.length(); i++)
        {
            if (str[i] == substr[0])
            
                // loop to find 2nd character
                for (int j = i+1; j < str1.length(); j++)
                {
                    if (str[j] == substr[1])
                    
                        // loop to find 3rd character
                        for (int k = j+1; k < str1.length(); k++)
                        
                            // increment count if subsequence 
                            // is found
                            if (str[k] == substr[2])
                                counter++;
                        }
                    }
                }
            }
        }
  
        return counter;
    }
      
    // Driver function
    public static void main(String argc[]){
        String str = "GFGFGYSYIOIWIN";
        String substr = "GFG";
  
        System.out.println(findOccurrences(str, substr)); 
    }
      
}
/* This code is contributed by Sagar Shukla */

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program to find 
# number of occurrences 
# of a subsequence of 
# length 3
  
# Function to find number 
# of occurrences of a 
# subsequence of length 
# three in a string
def findOccurrences(str, substr) :
  
    # variable to store 
    # no of occurrences
    counter = 0
  
    # loop to find
    # first character
    for i in range(0, len(str)) :
      
        if (str[i] == substr[0]) :
          
            # loop to find
            # 2nd character
            for j in range(i + 1
                           len(str)) :
              
                if (str[j] == substr[1]) :
                  
                    # loop to find
                    # 3rd character
                    for k in range(j + 1
                                   len(str)) :
                      
                        # increment count if 
                        # subsequence is found
                        if (str[k] == substr[2]) :
                            counter = counter + 1
  
    return counter
  
# Driver Code
str = "GFGFGYSYIOIWIN"
substr = "GFG"
print (findOccurrences(str, substr))
  
# This code is contributed by 
# Manish Shaw(manishshaw1)

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find number of occurrences of
// a subsequence of length 3
using System;
  
public class GfG {
      
    // Function to find number of occurrences of
    // a subsequence of length three in a string
    public static int findOccurrences(string str1, 
                                   string substr1)
    
          
        // variable to store no of occurrences
        int counter = 0;
          
        //char[] str = str1.toCharArray();
        //char[] substr = substr1.toCharArray();
          
        // loop to find first character
        for (int i=0; i < str1.Length; i++)
        {
            if (str1[i] == substr1[0])
            
                  
                // loop to find 2nd character
                for (int j = i+1; j < str1.Length; j++)
                {
                    if (str1[j] == substr1[1])
                    
                          
                        // loop to find 3rd character
                        for (int k = j+1; k < str1.Length; k++)
                        
                              
                            // increment count if subsequence 
                            // is found
                            if (str1[k] == substr1[2])
                                counter++;
                        }
                    }
                }
            }
        }
  
        return counter;
    }
      
    // Driver function
    public static void Main()
    {
        string str1 = "GFGFGYSYIOIWIN";
        string substr1 = "GFG";
  
        Console.WriteLine(findOccurrences(str1, substr1)); 
    }
}
  
/* This code is contributed by vt_m */

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find number 
// of occurrences of a 
// subsequence of length 3
  
// Function to find number of 
// occurrences of a subsequence 
// of length three in a string
function findOccurrences($str, $substr)
    // variable to store 
    // no of occurrences
    $counter = 0;
  
    // loop to find first character
    for ($i = 0;$i < strlen($str); $i++)
    {
        if ($str[$i] == $substr[0])
        
            // loop to find 2nd character
            for ($j = $i + 1; $j < strlen($str); $j++)
            {
                if ($str[$j] == $substr[1])
                
                    // loop to find 3rd character
                    for ($k = $j + 1; $k < strlen($str); $k++)
                    
                        // increment count if 
                        // subsequence is found
                        if ($str[$k] == $substr[2])
                            $counter++;
                    }
                }
            }
        }
    }
  
    return $counter;
}
  
// Driver Code
$str = "GFGFGYSYIOIWIN";
$substr = "GFG";
echo findOccurrences($str, $substr); 
  
// This code is contributed by aj_36 
?>

chevron_right



Output :

4

Time Complexity: O(n^3)
Auxiliary Space: O(1)

Efficient Approach: The efficient method to solve this problem is to use the concept of pre-calculation. The idea is for every occurrence of the middle character of subsequence in the string, pre-compute two values. That is, number of occurrences of first character before it and number of occurences of third character after it and multiply these two values to generate total occurrences for each occurrence of middle character.

Below is the implementation of this idea:

C

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find number of occurrences of
// a subsequence of length 3
#include<iostream>
using namespace std;
  
// Function to find number of occurrences of
// a subsequence of length three in a string
int findOccurrences(string str, string substr)
{    
    // calculate length of string
    int n = str.length();
  
    // auxilary array to store occurences of
    // first character
    int preLeft[n] = {0};
  
    // auxilary array to store occurences of
    // third character
    int preRight[n] = {0};
  
    if (str[0]==substr[0])
        preLeft[0]++;
  
    // calculate occurrences of first character 
    // upto ith index from left
    for (int i=1;i<n;i++)
    {
        if (str[i]==substr[0])        
            preLeft[i] = preLeft[i-1] + 1;        
        else
            preLeft[i] = preLeft[i-1];        
    }
  
    if (str[n-1]==substr[2])
        preRight[n-1]++;
  
    // calculate occurrences of third character 
    // upto ith index from right
    for(int i=n-2;i>=0;i--)
    {
        if (str[i]==substr[2])        
            preRight[i] = preRight[i+1] + 1;        
        else        
            preRight[i] = preRight[i+1];        
    }
  
    // variable to store total number of occurrences
    int counter = 0;
  
    // loop to find the occurrences of middle element
    for (int i=1; i<n-1;i++)
    {    
        // if middle character of subsequence is found 
        // in the string
        if (str[i]==str[1])
        {    
            // multiply the total occurrences of first 
            // character before middle character with 
            // the total occurrences of third character 
            // after middle character
            int total = preLeft[i-1]*preRight[i+1];
            counter += total;
        }
    }
  
    return counter;
}
  
// Driver code
int main()
{
    string str = "GFGFGYSYIOIWIN";
    string substr = "GFG";
    cout << findOccurrences(str,substr);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find number of occurrences of
// a subsequence of length 3
import java.util.*;
import java.lang.*;
  
public class GfG{
      
    // Function to find number of occurrences of
    // a subsequence of length three in a string
    public static int findOccurrences(String str1, String substr1)
    
        // calculate length of string
        int n = str1.length();
          
        char[] str = str1.toCharArray();
        char[] substr = substr1.toCharArray();
          
        // auxilary array to store occurences of
        // first character
        int[] preLeft = new int[n];
  
        // auxilary array to store occurences of
        // third character
        int[] preRight = new int[n];
  
        if (str[0] == substr[0])
            preLeft[0]++;
  
        // calculate occurrences of first character 
        // upto ith index from left
        for (int i = 1; i < n; i++)
        {
            if (str[i] == substr[0])     
                preLeft[i] = preLeft[i-1] + 1;     
            else
                preLeft[i] = preLeft[i-1];     
        }
  
        if (str[n-1] == substr[2])
            preRight[n-1]++;
  
        // calculate occurrences of third character 
        // upto ith index from right
        for(int i = n-2; i >= 0; i--)
        {
            if (str[i] == substr[2])     
                preRight[i] = preRight[i+1] + 1;     
            else    
                preRight[i] = preRight[i+1];     
        }
  
        // variable to store total number of occurrences
        int counter = 0;
  
        // loop to find the occurrences of middle element
        for (int i = 1; i < n-1; i++)
        
            // if middle character of subsequence is found 
            // in the string
            if (str[i] == str[1])
            
                // multiply the total occurrences of first 
                // character before middle character with 
                // the total occurrences of third character 
                // after middle character
                int total = preLeft[i-1] * preRight[i+1];
                counter += total;
            }
        }
  
        return counter;
    }
      
    // Driver function
    public static void main(String argc[]){
        String str = "GFGFGYSYIOIWIN";
        String substr = "GFG";
          
        System.out.println(findOccurrences(str, substr)); 
    }
      
    /* This code is contributed by Sagar Shukla */
}

chevron_right


Python3

# Python 3 program to find number of
# occurrences of a subsequence of length 3

# Function to find number of occurrences of
# a subsequence of length three in a string
def findOccurrences(str1, substr):

# calculate length of string
n = len(str1)

# auxilary array to store occurences of
# first character
preLeft = [0 for i in range(n)]

# auxilary array to store occurences of
# third character
preRight = [0 for i in range(n)]

if (str1[0] == substr[0]):
preLeft[0] += 1

# calculate occurrences of first character
# upto ith index from left
for i in range(1, n):
if (str1[i] == substr[0]):
preLeft[i] = preLeft[i – 1] + 1
else:
preLeft[i] = preLeft[i – 1]

if (str1[n – 1] == substr[2]):
preRight[n – 1] += 1

# calculate occurrences of third character
# upto ith index from right
i = n – 2
while(i >= 0):
if (str1[i] == substr[2]):
preRight[i] = preRight[i + 1] + 1
else:
preRight[i] = preRight[i + 1]

i -= 1

# variable to store
# total number of occurrences
counter = 0

# loop to find the occurrences
# of middle element
for i in range(1, n – 1):

# if middle character of subsequence
# is found in the string
if (str1[i] == str1[1]):

# multiply the total occurrences of first
# character before middle character with
# the total occurrences of third character
# after middle character
total = preLeft[i – 1] * preRight[i + 1]
counter += total

return counter

# Driver code
if __name__ == ‘__main__’:
str1 = “GFGFGYSYIOIWIN”
substr = “GFG”
print(findOccurrences(str1, substr))

# This code is contributed by
# Surendra_Gangwar

C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find number of occurrences of
// a subsequence of length 3
using System;
  
public class GfG {
      
    // Function to find number of occurrences of
    // a subsequence of length three in a string
    public static int findOccurrences(string str1, 
                                   string substr1)
    
          
        // calculate length of string
        int n = str1.Length;
          
        // char[] str = str1.toCharArray();
        // char[] substr = substr1.toCharArray();
          
        // auxilary array to store occurences of
        // first character
        int[] preLeft = new int[n];
  
        // auxilary array to store occurences of
        // third character
        int[] preRight = new int[n];
  
        if (str1[0] == substr1[0])
            preLeft[0]++;
  
        // calculate occurrences of first character 
        // upto ith index from left
        for (int i = 1; i < n; i++)
        {
            if (str1[i] == substr1[0]) 
                preLeft[i] = preLeft[i-1] + 1; 
            else
                preLeft[i] = preLeft[i-1]; 
        }
  
        if (str1[n-1] == substr1[2])
            preRight[n-1]++;
  
        // calculate occurrences of third character 
        // upto ith index from right
        for(int i = n-2; i >= 0; i--)
        {
            if (str1[i] == substr1[2]) 
                preRight[i] = preRight[i+1] + 1;     
            else
                preRight[i] = preRight[i+1];     
        }
  
        // variable to store total number of occurrences
        int counter = 0;
  
        // loop to find the occurrences of middle element
        for (int i = 1; i < n-1; i++)
        
              
            // if middle character of subsequence is found 
            // in the string
            if (str1[i] == str1[1])
            
                  
                // multiply the total occurrences of first 
                // character before middle character with 
                // the total occurrences of third character 
                // after middle character
                int total = preLeft[i-1] * preRight[i+1];
                counter += total;
            }
        }
  
        return counter;
    }
      
    // Driver function
    public static void Main()
    {
        string str1 = "GFGFGYSYIOIWIN";
        string substr1 = "GFG";
          
        Console.WriteLine(findOccurrences(str1, substr1)); 
    }
}
  
/* This code is contributed by Vt_m */

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find number 
// of occurrences of a 
// subsequence of length 3
  
// Function to find number 
// of occurrences of a 
// subsequence of length 
// three in a string
function findOccurrences($str
                         $substr)
    // calculate length of string
    $n = strlen($str);
  
    // auxilary array to store 
    // occurences of first character
    $preLeft = array(0);
  
    // auxilary array to store 
    // occurences of third character
    $preRight = array(0);
  
    if ($str[0] == $substr[0])
        $preLeft[0]++;
  
    // calculate occurrences
    // of first character 
    // upto ith index from left
    for ($i = 1; $i < $n; $i++)
    {
        if ($str[$i] == $substr[0]) 
            $preLeft[$i] = $preLeft[$i - 1] + 1; 
        else
            $preLeft[$i] = $preLeft[$i - 1]; 
    }
  
    if ($str[$n - 1] == $substr[2])
        $preRight[$n - 1]++;
  
    // calculate occurrences 
    // of third character 
    // upto ith index from right
    for($i = $n - 2; $i >= 0; $i--)
    {
        if ($str[$i] == $substr[2]) 
            $preRight[$i] = ($preRight[$i + 1] + 1); 
        else
            $preRight[$i] = $preRight[$i + 1];     
    }
  
    // variable to store total
    // number of occurrences
    $counter = 0;
  
    // loop to find the occurrences
    // of middle element
    for ($i = 1; $i < $n - 1; $i++)
    
        // if middle character of 
        // subsequence is found 
        // in the string
        if ($str[$i] == $str[1])
        
            // multiply the total occurrences 
            // of first character before 
            // middle character with the 
            // total occurrences of third 
            // character after middle character
            $total = $preLeft[$i - 1] * 
                     $preRight[$i + 1];
            $counter += $total;
        }
    }
  
    return $counter;
}
  
// Driver Code
$str = "GFGFGYSYIOIWIN";
$substr = "GFG";
echo findOccurrences($str, $substr);
  
// This code is contributed by aj_36
?>

chevron_right



Output :

4

Time Complexity: O(n)
Auxiliary Space: O(n)



My Personal Notes arrow_drop_up

Senior Technical Content Engineer | GeeksforGeeks

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.





Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.