给定一个由元音和辅音组成的字符串任务是找到可以安排字符串字符的方式,以使两个元音不相邻。
注意:鉴于元音数量<=辅音数量。
例子:
Input: str = "permutation"
Output : 907200
Input: str = "geeksforgeeks"
Output: 3175200
方法:
考虑上面的示例字符串“ permutation”:
- 首先将所有辅音放在其他位置,如下所示:
-- p -- r -- m -- t -- t -- n --
放置辅音的方式数量= 6! / 2! 。作为出现两次,应考虑一次。
- 然后将元音放置在其余位置。我们还有7个职位和5个元音来填补这7个职位。
因此,填充元音的方式数量= 。
总数方式= = 907200
假设在一个字符串,元音的数量为vowelCount ,而辅音的数量为consonantCount 。
Therefore,
Total ways = (consonantCount! / duplicateConsonant!) * C(consonantCount+1 , vowelCount) * (vowelCount! / duplicateVowel!)
下面是上述方法的实现:
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