Open In App

Number of Larger Elements on right side in a string

Given a string, find count of number of larger alphabets for every character of the string. 

Examples: 



Input  : str = "abcd"
Output : 3 2 1 0
There are 3 greater characters on right of 'a',
2 greater characters on right of 'b', 1 greater
character on right of 'c' and 0 greater characters
on right of 'd'.
      
Input :  geeks
Output : 2 2 2 1 0

A naive approach is to use two for loops. First will keep track of each alphabet in string and second loop will be used to find no of larger alphabet according to ASCII values. 

Implementation:






// CPP program to find counts of right greater
// characters for every character.
#include <bits/stdc++.h>
using namespace std;
 
void printGreaterCount(string str)
{
    int len = str.length(), right[len] = { 0 };
    for (int i = 0; i < len; i++)
        for (int j = i + 1; j < len; j++)
            if (str[i] < str[j])
                right[i]++;
 
    for (int i = 0; i < len; i++)
        cout << right[i] << " ";
}
 
// Driver code
int main()
{
    string str = "abcd";
    printGreaterCount(str);
    return 0;
}




// Java program to find counts of right greater
// characters for every character.
class GFG {
 
    static void printGreaterCount(String str)
    {
        int len = str.length(), right[] = new int[len];
        for (int i = 0; i < len; i++) {
            for (int j = i + 1; j < len; j++) {
                if (str.charAt(i) < str.charAt(j)) {
                    right[i]++;
                }
            }
        }
 
        for (int i = 0; i < len; i++) {
            System.out.print(right[i] + " ");
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str = "abcd";
        printGreaterCount(str);
    }
}
// This code is contributed Rajput-Ji




# Python3 program to find counts of right
# greater characters for every character.
 
def printGreaterCount(str):
    len__ = len(str)
    right = [0 for i in range(len__)]
    for i in range(len__):
        for j in range(i + 1, len__, 1):
            if (str[i] < str[j]):
                right[i] += 1
 
    for i in range(len__):
        print(right[i], end = " ")
 
# Driver code
if __name__ == '__main__':
    str = "abcd"
    printGreaterCount(str)
     
# This code is contributed by
# Sahil_Shelangia




// C# program to find counts of right greater
// characters for every character.
using System;
public class GFG {
 
    static void printGreaterCount(String str)
    {
        int len = str.Length;
        int[] right = new int[len];
        for (int i = 0; i < len; i++) {
            for (int j = i + 1; j < len; j++) {
                if (str[i] < str[j]) {
                    right[i]++;
                }
            }
        }
 
        for (int i = 0; i < len; i++) {
            Console.Write(right[i] + " ");
        }
    }
 
    // Driver code
    public static void Main()
    {
        String str = "abcd";
        printGreaterCount(str);
    }
}
// This code is contributed by 29AjayKumar




<?php
// PHP program to find counts
// of right greater characters
// for every character.
 
function printGreaterCount($str)
{
    $len = strlen($str);
    $right = array_fill(0, $len, 0);
    for ($i = 0; $i < $len; $i++)
    {
        for ($j = $i + 1; $j < $len; $j++)
            if ($str[$i] < $str[$j])
                $right[$i]++;
    }
 
    for ($i = 0; $i < $len; $i++)
        echo $right[$i] . " ";
}
 
// Driver code
$str = 'abcd';
printGreaterCount($str);
 
// This code is contributed
// by Abhinav96
?>




<script>
 
    // Javascript program to find
    // counts of right greater
    // characters for every character.
     
    function printGreaterCount(str)
    {
        let len = str.length;
        let right = new Array(len);
        right.fill(0);
        for (let i = 0; i < len; i++) {
            for (let j = i + 1; j < len; j++) {
                if (str[i].charCodeAt() < str[j].charCodeAt())
                {
                    right[i]++;
                }
            }
        }
   
        for (let i = 0; i < len; i++) {
            document.write(right[i] + " ");
        }
    }
     
    let str = "abcd";
      printGreaterCount(str);
     
</script>

Output
3 2 1 0 

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

An efficient approach is to traverse the string from right and keep track of counts of characters from right side. For every character that we traverse from right, we increment its count in count array and add counts of all greater characters to answer for this character.




// C++ program to count greater characters on right
// side of every character.
#include <bits/stdc++.h>
using namespace std;
#define MAX_CHAR 26
 
void printGreaterCount(string str)
{
    int len = str.length();
 
    // Arrays to store result and character counts.
    int ans[len] = { 0 }, count[MAX_CHAR] = { 0 };
 
    // start from right side of string
    for (int i = len - 1; i >= 0; i--) {
        count[str[i] - 'a']++;
        for (int j = str[i] - 'a' + 1; j < MAX_CHAR; j++)
            ans[i] += count[j];
    }
 
    for (int i = 0; i < len; i++)
        cout << ans[i] << " ";
}
 
// Driver code
int main()
{
    string str = "abcd";
    printGreaterCount(str);
    return 0;
}




// Java program to count greater characters on right
// side of every character.
public class GFG {
 
    final static int MAX_CHAR = 26;
 
    static void printGreaterCount(String str)
    {
        int len = str.length();
 
        // Arrays to store result and character counts.
        int ans[] = new int[len], count[] = new int[MAX_CHAR];
 
        // start from right side of string
        for (int i = len - 1; i >= 0; i--) {
            count[str.charAt(i) - 'a']++;
            for (int j = str.charAt(i) - 'a' + 1; j < MAX_CHAR; j++) {
                ans[i] += count[j];
            }
        }
 
        for (int i = 0; i < len; i++) {
            System.out.print(ans[i] + " ");
        }
    }
 
    // Driver code
    static public void main(String[] args)
    {
        String str = "abcd";
        printGreaterCount(str);
    }
}




# Python3 program to count greater characters on right
# side of every character.
 
MAX_CHAR=26;
 
def printGreaterCount(str1):
     
    len1 = len(str1);
 
    # Arrays to store result and character counts.
    ans=[0]*len1;
    count=[0]*MAX_CHAR;
 
    # start from right side of string
    for i in range(len1 - 1,-1,-1):
        count[ord(str1[i]) - ord('a')]+=1;
        for j in range(ord(str1[i]) - ord('a') + 1,MAX_CHAR):
            ans[i] += count[j];
 
    for i in range(len1):
        print(ans[i],end=" ");
 
# Driver code
str1 = "abcd";
printGreaterCount(str1);
 
# This code is contributed by mits




// C# program to count greater characters on right
// side of every character.
using System;
 
class GFG {
 
    static int MAX_CHAR = 26;
 
    static void printGreaterCount(string str)
    {
        int len = str.Length;
 
        // Arrays to store result and character counts.
        int[] ans = new int[len];
        int[] count = new int[MAX_CHAR];
 
        // start from right side of string
        for (int i = len - 1; i >= 0; i--) {
            count[str[i] - 'a']++;
            for (int j = str[i] - 'a' + 1; j < MAX_CHAR; j++) {
                ans[i] += count[j];
            }
        }
 
        for (int i = 0; i < len; i++) {
            Console.Write(ans[i] + " ");
        }
    }
 
    // Driver code
    static void Main()
    {
        string str = "abcd";
        printGreaterCount(str);
    }
}
 
// This code is contributed by mits




<?php
// PHP program to count greater characters on right
// side of every character.
 
$MAX_CHAR=26;
 
function printGreaterCount($str)
{
    global $MAX_CHAR;
    $len = strlen($str);
 
    // Arrays to store result and character counts.
    $ans=array_fill(0, $len, 0);
    $count=array_fill(0, $MAX_CHAR, 0);
 
    // start from right side of string
    for ($i = $len - 1; $i >= 0; $i--)
    {
        $count[ord($str[$i]) - ord('a')]++;
        for ($j = ord($str[$i]) - ord('a') + 1; $j < $MAX_CHAR; $j++)
            $ans[$i] += $count[$j];
    }
 
    for ($i = 0; $i < $len; $i++)
        echo $ans[$i]." ";
}
 
    // Driver code
    $str = "abcd";
    printGreaterCount($str);
 
// This code is contributed by mits
?>




<script>
    // Javascript program to count greater characters on right
    // side of every character.
     
    let MAX_CHAR = 26;
  
    function printGreaterCount(str)
    {
        let len = str.length;
  
        // Arrays to store result and character counts.
        let ans = new Array(len);
        ans.fill(0);
        let count = new Array(MAX_CHAR);
        count.fill(0);
  
        // start from right side of string
        for (let i = len - 1; i >= 0; i--) {
            count[str[i].charCodeAt() - 'a'.charCodeAt()]++;
            for (let j = str[i].charCodeAt() - 'a'.charCodeAt() + 1; j < MAX_CHAR; j++) {
                ans[i] += count[j];
            }
        }
  
        for (let i = 0; i < len; i++) {
            document.write(ans[i] + " ");
        }
    }
     
    let str = "abcd";
    printGreaterCount(str);
     
    // This code is contributed by decode2207.
</script>

Output
3 2 1 0 

Time Complexity: O(N)
Auxiliary space: O(N)


Article Tags :