给定一个包含元音和辅音的单词。任务是发现可以以多种方式排列单词,以使元音始终在一起。给定单词的长度<10。
例子:
Input: str = "geek"
Output: 6
Ways such that both 'e' comes together are 6
i.e. geek, gkee, kgee, eekg, eegk, keeg
Input: str = "corporation"
Output: 50400
方法:由于单词同时包含元音和辅音。需要所有元音保持在一起,然后我们将所有元音当作一个字母。
As, in the word ‘geeksforgeeks’, we can treat the vowels “eeoee” as one letter.
Thus, we have gksfrgks (eeoee).
This has 9 (8 + 1) letters of which g, k, s each occurs 2 times and the rest are different.
The number of ways arranging these letters = 9!/(2!)x(2!)x(2!) = 45360 ways
Now, 5 vowels in which ‘e’ occurs 4 times and ‘o’ occurs 1 time, can be arranged in 5! /4! = 5 ways.
Required number of ways = (45360 x 5) = 226800
下面是上述方法的实现:
C++
// C++ program to calculate the no. of ways
// to arrange the word having vowels together
#include
#define ll long long int
using namespace std;
// Factorial of a number
ll fact(int n)
{
ll f = 1;
for (int i = 2; i <= n; i++)
f = f * i;
return f;
}
// calculating ways for arranging consonants
ll waysOfConsonants(int size1, int freq[])
{
ll ans = fact(size1);
for (int i = 0; i < 26; i++) {
// Ignore vowels
if (i == 0 || i == 4 || i == 8 || i == 14 || i == 20)
continue;
else
ans = ans / fact(freq[i]);
}
return ans;
}
// calculating ways for arranging vowels
ll waysOfVowels(int size2, int freq[])
{
return fact(size2) / (fact(freq[0]) * fact(freq[4]) * fact(freq[8])
* fact(freq[14]) * fact(freq[20]));
}
// Function to count total no. of ways
ll countWays(string str)
{
int freq[26] = { 0 };
for (int i = 0; i < str.length(); i++)
freq[str[i] - 'a']++;
// Count vowels and consonant
int vowel = 0, consonant = 0;
for (int i = 0; i < str.length(); i++) {
if (str[i] != 'a' && str[i] != 'e' && str[i] != 'i'
&& str[i] != 'o' && str[i] != 'u')
consonant++;
else
vowel++;
}
// total no. of ways
return waysOfConsonants(consonant+1, freq) *
waysOfVowels(vowel, freq);
}
// Driver code
int main()
{
string str = "geeksforgeeks";
cout << countWays(str) << endl;
return 0;
}
Java
// Java program to calculate the no. of
// ways to arrange the word having
// vowels together
import java.util.*;
class GFG{
// Factorial of a number
static int fact(int n)
{
int f = 1;
for(int i = 2; i <= n; i++)
f = f * i;
return f;
}
// Calculating ways for arranging consonants
static int waysOfConsonants(int size1,
int []freq)
{
int ans = fact(size1);
for(int i = 0; i < 26; i++)
{
// Ignore vowels
if (i == 0 || i == 4 || i == 8 ||
i == 14 || i == 20)
continue;
else
ans = ans / fact(freq[i]);
}
return ans;
}
// Calculating ways for arranging vowels
static int waysOfVowels(int size2, int [] freq)
{
return fact(size2) / (fact(freq[0]) *
fact(freq[4]) * fact(freq[8]) *
fact(freq[14]) * fact(freq[20]));
}
// Function to count total no. of ways
static int countWays(String str)
{
int []freq = new int [200];
for(int i = 0; i < 200; i++)
freq[i] = 0;
for(int i = 0; i < str.length(); i++)
freq[str.charAt(i) - 'a']++;
// Count vowels and consonant
int vowel = 0, consonant = 0;
for(int i = 0; i < str.length(); i++)
{
if (str.charAt(i) != 'a' && str.charAt(i) != 'e' &&
str.charAt(i) != 'i' && str.charAt(i) != 'o' &&
str.charAt(i) != 'u')
consonant++;
else
vowel++;
}
// Total no. of ways
return waysOfConsonants(consonant + 1, freq) *
waysOfVowels(vowel, freq);
}
// Driver code
public static void main(String []args)
{
String str = "geeksforgeeks";
System.out.println(countWays(str));
}
}
// This code is contributed by rutvik_56
Python3
# Python3 program to calculate
# the no. of ways to arrange
# the word having vowels together
# Factorial of a number
def fact(n):
f = 1
for i in range(2, n + 1):
f = f * i
return f
# calculating ways for
# arranging consonants
def waysOfConsonants(size1, freq):
ans = fact(size1)
for i in range(26):
# Ignore vowels
if (i == 0 or i == 4 or
i == 8 or i == 14 or
i == 20):
continue
else:
ans = ans // fact(freq[i])
return ans
# calculating ways for
# arranging vowels
def waysOfVowels(size2, freq):
return (fact(size2) // (fact(freq[0]) *
fact(freq[4]) * fact(freq[8]) *
fact(freq[14]) * fact(freq[20])))
# Function to count total no. of ways
def countWays(str1):
freq = [0] * 26
for i in range(len(str1)):
freq[ord(str1[i]) -
ord('a')] += 1
# Count vowels and consonant
vowel = 0
consonant = 0
for i in range(len(str1)):
if (str1[i] != 'a' and str1[i] != 'e' and
str1[i] != 'i' and str1[i] != 'o' and
str1[i] != 'u'):
consonant += 1
else:
vowel += 1
# total no. of ways
return (waysOfConsonants(consonant + 1, freq) *
waysOfVowels(vowel, freq))
# Driver code
if __name__ == "__main__":
str1 = "geeksforgeeks"
print(countWays(str1))
# This code is contributed by Chitranayal
C#
// C# program to calculate the no. of
// ways to arrange the word having
// vowels together
using System.Collections.Generic;
using System;
class GFG{
// Factorial of a number
static int fact(int n)
{
int f = 1;
for(int i = 2; i <= n; i++)
f = f * i;
return f;
}
// Calculating ways for arranging consonants
static int waysOfConsonants(int size1,
int []freq)
{
int ans = fact(size1);
for(int i = 0; i < 26; i++)
{
// Ignore vowels
if (i == 0 || i == 4 || i == 8 ||
i == 14 || i == 20)
continue;
else
ans = ans / fact(freq[i]);
}
return ans;
}
// Calculating ways for arranging vowels
static int waysOfVowels(int size2, int [] freq)
{
return fact(size2) / (fact(freq[0]) *
fact(freq[4]) * fact(freq[8]) *
fact(freq[14]) * fact(freq[20]));
}
// Function to count total no. of ways
static int countWays(string str)
{
int []freq = new int [200];
for(int i = 0; i < 200; i++)
freq[i] = 0;
for(int i = 0; i < str.Length; i++)
freq[str[i] - 'a']++;
// Count vowels and consonant
int vowel = 0, consonant = 0;
for(int i = 0; i < str.Length; i++)
{
if (str[i] != 'a' && str[i] != 'e' &&
str[i] != 'i' && str[i] != 'o' &&
str[i] != 'u')
consonant++;
else
vowel++;
}
// Total no. of ways
return waysOfConsonants(consonant + 1, freq) *
waysOfVowels(vowel, freq);
}
// Driver code
public static void Main()
{
string str = "geeksforgeeks";
Console.WriteLine(countWays(str));
}
}
// This code is contributed by Stream_Cipher
输出:
226800
进一步优化:我们可以预先计算所需的阶乘值,以避免重新计算。