Number of distinct permutation a String can have
Last Updated :
12 Jul, 2022
We are given a string having only lowercase alphabets. The task is to find out total number of distinct permutation can be generated by that string.
Examples:
Input : aab
Output : 3
Different permutations are "aab",
"aba" and "baa".
Input : ybghjhbuytb
Output : 1663200
A simple solution is to find all the distinct permutation and count them.
We can find the count without finding all permutation. Idea is to find all the characters that is getting repeated, i.e., frequency of all the character. Then, we divide the factorial of the length of string by multiplication of factorial of frequency of characters.
In second example, number of character is 11 and here h and y are repeated 2 times whereas g is repeated 3 times.
So, number of permutation is 11! / (2!2!3!) = 1663200
Below is the implementation of above idea.
C++
#include<bits/stdc++.h>
using namespace std;
const int MAX_CHAR = 26;
int factorial( int n)
{
int fact = 1;
for ( int i = 2; i <= n; i++)
fact = fact * i;
return fact;
}
int countDistinctPermutations(string str)
{
int length = str.length();
int freq[MAX_CHAR];
memset (freq, 0, sizeof (freq));
for ( int i = 0; i < length; i++)
if (str[i] >= 'a' )
freq[str[i] - 'a' ]++;
int fact = 1;
for ( int i = 0; i < MAX_CHAR; i++)
fact = fact * factorial(freq[i]);
return factorial(length) / fact;
}
int main()
{
string str = "fvvfhvgv" ;
printf ( "%d" , countDistinctPermutations(str));
return 0;
}
|
Java
public class GFG {
static final int MAX_CHAR = 26 ;
static int factorial( int n)
{
int fact = 1 ;
for ( int i = 2 ; i <= n; i++)
fact = fact * i;
return fact;
}
static int countDistinctPermutations(String str)
{
int length = str.length();
int [] freq = new int [MAX_CHAR];
for ( int i = 0 ; i < length; i++)
if (str.charAt(i) >= 'a' )
freq[str.charAt(i) - 'a' ]++;
int fact = 1 ;
for ( int i = 0 ; i < MAX_CHAR; i++)
fact = fact * factorial(freq[i]);
return factorial(length) / fact;
}
public static void main(String args[])
{
String str = "fvvfhvgv" ;
System.out.println(countDistinctPermutations(str));
}
}
|
Python3
MAX_CHAR = 26
def factorial(n) :
fact = 1 ;
for i in range ( 2 , n + 1 ) :
fact = fact * i;
return fact
def countDistinctPermutations(st) :
length = len (st)
freq = [ 0 ] * MAX_CHAR
for i in range ( 0 , length) :
if (st[i] > = 'a' ) :
freq[( ord )(st[i]) - 97 ] = freq[( ord )(st[i]) - 97 ] + 1 ;
fact = 1
for i in range ( 0 , MAX_CHAR) :
fact = fact * factorial(freq[i])
return factorial(length) / / fact
st = "fvvfhvgv"
print (countDistinctPermutations(st))
|
C#
using System;
public class GFG {
static int MAX_CHAR = 26;
static int factorial( int n)
{
int fact = 1;
for ( int i = 2; i <= n; i++)
fact = fact * i;
return fact;
}
static int countDistinctPermutations(String str)
{
int length = str.Length;
int [] freq = new int [MAX_CHAR];
for ( int i = 0; i < length; i++)
if (str[i] >= 'a' )
freq[str[i] - 'a' ]++;
int fact = 1;
for ( int i = 0; i < MAX_CHAR; i++)
fact = fact * factorial(freq[i]);
return factorial(length) / fact;
}
public static void Main(String []args)
{
String str = "fvvfhvgv" ;
Console.Write(countDistinctPermutations(str));
}
}
|
Javascript
<script>
let MAX_CHAR = 26;
function factorial(n)
{
let fact = 1;
for (let i = 2; i <= n; i++)
fact = fact * i;
return fact;
}
function countDistinctPermutations(str)
{
let length = str.length;
let freq = new Array(MAX_CHAR);
freq.fill(0);
for (let i = 0; i < length; i++)
if (str[i].charCodeAt() >= 'a' .charCodeAt())
freq[str[i].charCodeAt() - 'a' .charCodeAt()]++;
let fact = 1;
for (let i = 0; i < MAX_CHAR; i++)
fact = fact * factorial(freq[i]);
return parseInt(factorial(length) / fact, 10);
}
let str = "fvvfhvgv" ;
document.write(countDistinctPermutations(str));
</script>
|
Time Complexity: O(n), where n is the length of the string
Auxiliary Space: O(n), where n is the length of the string
Share your thoughts in the comments
Please Login to comment...