Permutaciones de cuerdas tales que no hay dos vocales adyacentes

Dada una string formada por vocales y consonantes. La tarea es encontrar el número de formas en que los caracteres de la string se pueden organizar de manera que no haya dos vocales adyacentes entre sí. 
Nota : Dado que No. de vocales <= No. de consonantes .

Ejemplos: 

Input: str = "permutation"
Output : 907200

Input: str = "geeksforgeeks"
Output: 3175200 

Enfoque: 
considere la string de ejemplo anterior «permutación»: 

  • Primero coloque todas las consonantes en los lugares alternos como se muestra a continuación:
-- p -- r -- m -- t -- t -- n --
  • ¡ Número de formas de colocar las consonantes = 6! / 2! . as  t   aparece dos veces y debe considerarse una vez.
  • Luego coloque las vocales en las posiciones restantes. Tenemos 7 posiciones restantes y 5 vocales para llenar estos 7 lugares. 
    Por lo tanto, el número de formas de llenar las vocales =  $7_{C_5} \times 5!$  .
Total no. of ways =  (6! / 2!) \times 7_{C_5} \times 5!= 907200

Supongamos que, en una string, el número de vocales es vocalCount y el número de consonantes es consonantCount

Por lo tanto,
Total de formas = (consonantCount! / duplicateConsonant!) * C (consonantCount+1 , vocalCount) * (vocalCount! / duplicateVowel!)

A continuación se muestra la implementación del enfoque anterior: 

C++

// CPP program to count permutations of string
// such that no two vowels are adjacent
 
#include <bits/stdc++.h>
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

<?php
// CPP program to count permutations of string
// such that no two vowels are adjacent
  
// Factorial of a number
function factorial($n)
{
    $fact = 1;
    for ($i = 2; $i <= $n; $i++)
        $fact = $fact * $i;
  
    return $fact;
}
  
// Function to find c(n, r)
function ncr($n, $r)
{
    return factorial($n) / (factorial($r) * factorial($n - $r));
}
  
// Function to count permutations of string
// such that no two vowels are adjacent
function countWays($str)
{
    $freq = array_fill(0,26,NULL);
    $nvowels = 0;
    $nconsonants = 0;
  
    // Finding the frequencies of
    // the characters
    for ($i = 0; $i < strlen($str); $i++)
        ++$freq[ord($str[$i]) - ord('a')];
  
    // finding the no. of vowels and
    // consonants in given word
    for ($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 ($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 ($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.
?>

Javascript

<script>
// Javascript program to count permutations of string
// such that no two vowels are adjacent
     
    // Factorial of a number
    function factorial(n)
    {
        let fact = 1;
            for (let i = 2; i <= n; i++)
                fact = fact * i;
           
            return fact;
    }
     
     // Function to find c(n, r)
    function ncr(n,r)
    {
        return Math.floor(factorial(n) / (factorial(r) * factorial(n - r)));
    }
     
    // Function to count permutations of string
        // such that no two vowels are adjacent
    function countWays(str)
    {
 
            let freq=new Array(26);
               
              for(let i=0;i<26;i++)
            {
                freq[i]=0;
            }
               
            let nvowels = 0, nconsonants = 0;
           
            let vplaces, cways, vways;
           
            // Finding the frequencies of
            // the characters
            for (let i = 0; i < str.length; i++)
                ++freq[str[i].charCodeAt(0) - 'a'.charCodeAt(0)];
           
            // finding the no. of vowels and
            // consonants in given word
            for (let 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 (let i = 0; i < 26; i++) {
                if (i != 0 && i != 4 && i != 8 && i != 14
                    && i != 20 && freq[i] > 1) {
           
                    cways = Math.floor(cways / factorial(freq[i]));
                }
            }
           
            // ways to put vowels 7C5 x 5!
            vways = ncr(vplaces, nvowels) * factorial(nvowels);
            for (let i = 0; i < 26; i++) {
                if (i == 0 || i == 4 || i == 8 || i == 14
                    || i == 20 && freq[i] > 1) {
                    vways = Math.floor(vways / factorial(freq[i]));
                }
            }
           
            return cways * vways;
             
    }
     
     // Driver code
    let str = "permutation";
    document.write(countWays(str));
     
     
     
// This code is contributed by rag2127
</script>

Producción: 

907200

Complejidad de tiempo: O(|str|)

Espacio Auxiliar: O(1)
 

Publicación traducida automáticamente

Artículo escrito por SURENDRA_GANGWAR y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *