📌  相关文章
📜  字符串可以具有的不同排列数

📅  最后修改于: 2021-05-04 17:07:39             🧑  作者: Mango

给我们一个仅包含小写字母的字符串。任务是找出该字符串可以生成的不同排列的总数。

例子:

Input : aab
Output : 3
Different permutations are "aab",
"aba" and "baa".

Input : ybghjhbuytb
Output : 1663200

一个简单的解决方案是找到所有不同的排列并对它们进行计数。

我们可以找到计数而不找到所有排列。想法是找到所有重复的字符,即所有字符的频率。然后,我们通过的阶乘字符的频率的乘法划分字符串的长度的阶乘。

在第二个示例中,字符数为11,此处的hy重复2次,而g重复3次。
因此,排列数为11! /(2!2!3!)= 1663200

以下是上述想法的实现。

C++
// C++ program to find number of distinct
// permutations of a string.
#include
using namespace std;
const int MAX_CHAR = 26;
  
// Utility function to find factorial of n.
int factorial(int n)
{
    int fact = 1;
    for (int i = 2; i <= n; i++)
        fact = fact * i;
    return fact;
}
  
// Returns count of distinct permutations
// of str.
int countDistinctPermutations(string str)
{
    int length = str.length();
  
    int freq[MAX_CHAR];
    memset(freq, 0, sizeof(freq));
  
    // finding frequency of all the lower case
    // alphabet and storing them in array of
    // integer
    for (int i = 0; i < length; i++)
        if (str[i] >= 'a')
            freq[str[i] - 'a']++;
  
    // finding factorial of number of appearances
    // and multiplying them since they are
    // repeating alphabets
    int fact = 1;
    for (int i = 0; i < MAX_CHAR; i++)
        fact = fact * factorial(freq[i]);
  
    // finding factorial of size of string and
    // dividing it by factorial found after
    // multiplying
    return factorial(length) / fact;
}
  
// Driver code
int main()
{
    string str = "fvvfhvgv";
    printf("%d", countDistinctPermutations(str));
    return 0;
}


Java
// Java program to find number of distinct
// permutations of a string.
public class GFG {
      
    static final int MAX_CHAR = 26;
       
    // Utility function to find factorial of n.
    static int factorial(int n)
    {
        int fact = 1;
        for (int i = 2; i <= n; i++)
            fact = fact * i;
        return fact;
    }
       
    // Returns count of distinct permutations
    // of str.
    static int countDistinctPermutations(String str)
    {
        int length = str.length();
       
        int[] freq = new int[MAX_CHAR];
       
        // finding frequency of all the lower case
        // alphabet and storing them in array of
        // integer
        for (int i = 0; i < length; i++)
            if (str.charAt(i) >= 'a')
                freq[str.charAt(i) - 'a']++;
       
        // finding factorial of number of appearances
        // and multiplying them since they are
        // repeating alphabets
        int fact = 1;
        for (int i = 0; i < MAX_CHAR; i++)
            fact = fact * factorial(freq[i]);
       
        // finding factorial of size of string and
        // dividing it by factorial found after
        // multiplying
        return factorial(length) / fact;
    }
       
    // Driver code
    public static void main(String args[])
    {
        String str = "fvvfhvgv";
        System.out.println(countDistinctPermutations(str));
    }
}
// This code is contributed by Sumit Ghosh


Python
# Python program to find number of distinct
# permutations of a string.
  
MAX_CHAR = 26
  
# Utility function to find factorial of n.
def factorial(n) :
      
    fact = 1;
    for i in range(2, n + 1) :
        fact = fact * i;
    return fact
        
# Returns count of distinct permutations
# of str.
def countDistinctPermutations(st) :
      
    length = len(st)
    freq = [0] * MAX_CHAR
      
    # finding frequency of all the lower
    # case alphabet and storing them in
    # array of integer
    for i in range(0, length) :
        if (st[i] >= 'a') :
            freq[(ord)(st[i]) - 97] = freq[(ord)(st[i]) - 97] + 1;
    
    # finding factorial of number of
    # appearances and multiplying them
    # since they are repeating alphabets
    fact = 1
    for i in range(0, MAX_CHAR) :
        fact = fact * factorial(freq[i])
    
    # finding factorial of size of string
    # and dividing it by factorial found
    # after multiplying
    return factorial(length) / fact
  
# Driver code
st = "fvvfhvgv"
print (countDistinctPermutations(st))
  
# This code is contributed by Nikita Tiwari.


C#
// C# program to find number of distinct
// permutations of a string.
using System;
  
public class GFG {
      
    static int MAX_CHAR = 26;
      
    // Utility function to find factorial of n.
    static int factorial(int n)
    {
        int fact = 1;
        for (int i = 2; i <= n; i++)
            fact = fact * i;
              
        return fact;
    }
      
    // Returns count of distinct permutations
    // of str.
    static int countDistinctPermutations(String str)
    {
        int length = str.Length;
      
        int[] freq = new int[MAX_CHAR];
      
        // finding frequency of all the lower case
        // alphabet and storing them in array of
        // integer
        for (int i = 0; i < length; i++)
            if (str[i] >= 'a')
                freq[str[i] - 'a']++;
      
        // finding factorial of number of appearances
        // and multiplying them since they are
        // repeating alphabets
        int fact = 1;
        for (int i = 0; i < MAX_CHAR; i++)
            fact = fact * factorial(freq[i]);
      
        // finding factorial of size of string and
        // dividing it by factorial found after
        // multiplying
        return factorial(length) / fact;
    }
      
    // Driver code
    public static void Main(String []args)
    {
        String str = "fvvfhvgv";
          
        Console.Write(countDistinctPermutations(str));
    }
}
  
// This code is contributed by parashar.


输出:

840