📜  字符串的排列,以使两个元音不相邻

📅  最后修改于: 2021-05-05 02:09:30             🧑  作者: Mango

给定一个由元音和辅音组成的字符串任务是找到可以安排字符串字符的方式,以使两个元音不相邻。

注意:鉴于元音数量<=辅音数量

例子:

Input: str = "permutation"
Output : 907200

Input: str = "geeksforgeeks"
Output: 3175200

方法:
考虑上面的示例字符串“ permutation”:

  • 首先将所有辅音放在其他位置,如下所示:
    -- p -- r -- m -- t -- t -- n --
    

    放置辅音的方式数量= 6! / 2! 。作为t出现两次,应考虑一次。

  • 然后将元音放置在其余位置。我们还有7个职位和5个元音来填补这7个职位。
    因此,填充元音的方式数量= $7_{C_5} \times 5!$

总数方式=  (6! / 2!) \times 7_{C_5} \times 5! = 907200

假设在一个字符串,元音的数量为vowelCount ,而辅音的数量为consonantCount

下面是上述方法的实现:

C++
// CPP program to count permutations of string
// such that no two vowels are adjacent
  
#include 
using namespace std;
  
// Factorial of a number
int factorial(int n)
{
  
    int fact = 1;
    for (int i = 2; i <= n; i++)
        fact = fact * i;
  
    return fact;
}
  
// Function to find c(n, r)
int ncr(int n, int r)
{
    return factorial(n) / (factorial(r) * factorial(n - r));
}
  
// Function to count permutations of string
// such that no two vowels are adjacent
int countWays(string str)
{
    int freq[26] = { 0 };
    int nvowels = 0, nconsonants = 0;
  
    int vplaces, cways, vways;
  
    // Finding the frequencies of
    // the characters
    for (int i = 0; i < str.length(); i++)
        ++freq[str[i] - 'a'];
  
    // finding the no. of vowels and
    // consonants in given word
    for (int i = 0; i < 26; i++) {
  
        if (i == 0 || i == 4 || i == 8
            || i == 14 || i == 20)
            nvowels += freq[i];
        else
            nconsonants += freq[i];
    }
    // finding places for the vowels
    vplaces = nconsonants + 1;
  
    // ways to fill consonants 6! / 2!
    cways = factorial(nconsonants);
    for (int i = 0; i < 26; i++) {
        if (i != 0 && i != 4 && i != 8 && i != 14
            && i != 20 && freq[i] > 1) {
  
            cways = cways / factorial(freq[i]);
        }
    }
  
    // ways to put vowels 7C5 x 5!
    vways = ncr(vplaces, nvowels) * factorial(nvowels);
    for (int i = 0; i < 26; i++) {
        if (i == 0 || i == 4 || i == 8 || i == 14
            || i == 20 && freq[i] > 1) {
            vways = vways / factorial(freq[i]);
        }
    }
  
    return cways * vways;
}
  
// Driver code
int main()
{
    string str = "permutation";
  
    cout << countWays(str) << endl;
  
    return 0;
}


Java
// Java program to count permutations of string
// such that no two vowels are adjacent
  
class GFG
{
              
        // Factorial of a number
        static int factorial(int n)
        {
          
            int fact = 1;
            for (int i = 2; i <= n; i++)
                fact = fact * i;
          
            return fact;
        }
          
        // Function to find c(n, r)
        static int ncr(int n, int r)
        {
            return factorial(n) / (factorial(r) * factorial(n - r));
        }
          
        // Function to count permutations of string
        // such that no two vowels are adjacent
        static int countWays(String str)
        {
            int freq[]=new int[26];
              
            for(int i=0;i<26;i++)
            {
                freq[i]=0;
            }
              
            int nvowels = 0, nconsonants = 0;
          
            int vplaces, cways, vways;
          
            // Finding the frequencies of
            // the characters
            for (int i = 0; i < str.length(); i++)
                ++freq[str.charAt(i) - 'a'];
          
            // finding the no. of vowels and
            // consonants in given word
            for (int i = 0; i < 26; i++) {
          
                if (i == 0 || i == 4 || i == 8
                    || i == 14 || i == 20)
                    nvowels += freq[i];
                else
                    nconsonants += freq[i];
            }
            // finding places for the vowels
            vplaces = nconsonants + 1;
          
            // ways to fill consonants 6! / 2!
            cways = factorial(nconsonants);
            for (int i = 0; i < 26; i++) {
                if (i != 0 && i != 4 && i != 8 && i != 14
                    && i != 20 && freq[i] > 1) {
          
                    cways = cways / factorial(freq[i]);
                }
            }
          
            // ways to put vowels 7C5 x 5!
            vways = ncr(vplaces, nvowels) * factorial(nvowels);
            for (int i = 0; i < 26; i++) {
                if (i == 0 || i == 4 || i == 8 || i == 14
                    || i == 20 && freq[i] > 1) {
                    vways = vways / factorial(freq[i]);
                }
            }
          
            return cways * vways;
        }
          
        // Driver code
        public static void main(String []args)
        {
            String str = "permutation";
          
            System.out.println(countWays(str));
          
          
        }
}
  
// This code is contributed
// by ihritik


Python3
# Python3 program to count permutations of 
# string such that no two vowels are adjacent 
  
# Factorial of a number 
def factorial(n) : 
  
    fact = 1; 
    for i in range(2, n + 1) :
        fact = fact * i
  
    return fact
  
# Function to find c(n, r) 
def ncr(n, r) :
      
    return factorial(n) // (factorial(r) * 
                            factorial(n - r))
  
# Function to count permutations of string 
# such that no two vowels are adjacent 
def countWays(string) : 
  
    freq = [0] * 26
    nvowels, nconsonants = 0, 0
  
    # Finding the frequencies of 
    # the characters 
    for i in range(len(string)) :
        freq[ord(string[i]) - ord('a')] += 1
  
    # finding the no. of vowels and 
    # consonants in given word 
    for i in range(26) :
  
        if (i == 0 or i == 4 or i == 8
            or i == 14 or i == 20) :
            nvowels += freq[i] 
        else :
            nconsonants += freq[i]
      
    # finding places for the vowels 
    vplaces = nconsonants + 1
  
    # ways to fill consonants 6! / 2! 
    cways = factorial(nconsonants)
    for i in range(26) :
        if (i != 0 and i != 4 and i != 8 and
            i != 14 and i != 20 and freq[i] > 1) : 
  
            cways = cways // factorial(freq[i])
  
    # ways to put vowels 7C5 x 5! 
    vways = ncr(vplaces, nvowels) * factorial(nvowels)
    for i in range(26) :
        if (i == 0 or i == 4 or i == 8 or i == 14
            or i == 20 and freq[i] > 1) :
            vways = vways // factorial(freq[i]) 
  
    return cways * vways; 
  
# Driver code 
if __name__ == "__main__" :
  
    string = "permutation"
  
    print(countWays(string))
  
# This code is contributed by Ryuga


C#
// C# program to count permutations of string
// such that no two vowels are adjacent
  
using System;
class GFG
{
              
        // Factorial of a number
        static int factorial(int n)
        {
          
            int fact = 1;
            for (int i = 2; i <= n; i++)
                fact = fact * i;
          
            return fact;
        }
          
        // Function to find c(n, r)
        static int ncr(int n, int r)
        {
            return factorial(n) / (factorial(r) * factorial(n - r));
        }
          
        // Function to count permutations of string
        // such that no two vowels are adjacent
        static int countWays(String str)
        {
            int []freq=new int[26];
              
            for(int i=0;i<26;i++)
            {
                freq[i]=0;
            }
              
            int nvowels = 0, nconsonants = 0;
          
            int vplaces, cways, vways;
          
            // Finding the frequencies of
            // the characters
            for (int i = 0; i < str.Length; i++)
                ++freq[str[i] - 'a'];
          
            // finding the no. of vowels and
            // consonants in given word
            for (int i = 0; i < 26; i++) {
          
                if (i == 0 || i == 4 || i == 8
                    || i == 14 || i == 20)
                    nvowels += freq[i];
                else
                    nconsonants += freq[i];
            }
            // finding places for the vowels
            vplaces = nconsonants + 1;
          
            // ways to fill consonants 6! / 2!
            cways = factorial(nconsonants);
            for (int i = 0; i < 26; i++) {
                if (i != 0 && i != 4 && i != 8 && i != 14
                    && i != 20 && freq[i] > 1) {
          
                    cways = cways / factorial(freq[i]);
                }
            }
          
            // ways to put vowels 7C5 x 5!
            vways = ncr(vplaces, nvowels) * factorial(nvowels);
            for (int i = 0; i < 26; i++) {
                if (i == 0 || i == 4 || i == 8 || i == 14
                    || i == 20 && freq[i] > 1) {
                    vways = vways / factorial(freq[i]);
                }
            }
          
            return cways * vways;
        }
          
        // Driver code
        public static void Main()
        {
            String str = "permutation";
          
            Console.WriteLine(countWays(str));
          
          
        }
}
  
// This code is contributed
// by ihritik


PHP
 1) {
   
            $cways = $cways / factorial($freq[$i]);
        }
    }
   
    // ways to put vowels 7C5 x 5!
    $vways = ncr($vplaces, $nvowels) * factorial($nvowels);
    for ($i = 0; $i < 26; $i++) {
        if ($i == 0 || $i == 4 || $i == 8 || $i == 14
            || $i == 20 && $freq[$i] > 1) {
            $vways = $vways / factorial($freq[$i]);
        }
    }
    return $cways * $vways;
}
   
// Driver code
  
$str = "permutation"; 
echo countWays($str)."\n";
return 0;
// this code is contributed by Ita_c.
?>


输出:

907200