Given two strings, str1 of length N and str2 of length M of distinct characters, the task is to count the number of ways to place all the characters of str1 and str2 alternatively.
Note: |N – M| ? 1
Examples:
Input: str1 =“ae”, str2 = “bd”
Output: 8
Explanations:
Possible strings after rearrangements are : {“abed”, “ebad”, “adeb”, “edab”, “bade”, “beda”, “dabe”, “deba”}. Therefore, the required output is 8.Input: str1= “aegh”, str2=”rsw”
Output: 144
Approach: The problem can be solved based on the following observations:
If N != M: Consider only the case of N > M because similarly, it will work for the case N < M.
Total number of ways to rearrange all the characters of str1 = N!
Total number of ways to rearrange all the characters of str2 = M!.
Therefore, the total number of ways to place all the characters of str1 and str2 alternatively are = N! * M!
If N == M:
Total number of ways to rearrange all the characters of str1 = N!
Total number of ways to rearrange all the characters of str2 = M!
Now,
There are two cases possible here:
- First place the character of str1 and then place the character of str2.
- First place the character of str2 and then place the character of str1.
Therefore, the total number of ways = (2 * N! * M!).
Below is the implementation of the above approach:
// C++ Program to implement // the above approach #include <bits/stdc++.h> using namespace std;
// Function to get the // factorial of N int fact( int n)
{ int res = 1;
for ( int i = 1; i <= n; i++) {
res = res * i;
}
return res;
} // Function to get the total // number of distinct ways int distinctWays(string str1, string str2)
{ // Length of str1
int n = str1.length();
// Length of str2
int m = str2.length();
// If both strings have equal length
if (n == m) {
return 2 * fact(n) * fact(m);
}
// If both strings do not have
// equal length
return fact(n) * fact(m);
} // Driver code int main()
{ string str1 = "aegh" ;
string str2 = "rsw" ;
cout << distinctWays(str1, str2);
} |
// Java program to implement // the above approach import java.io.*;
class GFG{
// Function to get the // factorial of N static int fact( int n)
{ int res = 1 ;
for ( int i = 1 ; i <= n; i++)
{
res = res * i;
}
return res;
} // Function to get the total // number of distinct ways static int distinctWays(String str1,
String str2)
{ // Length of str1
int n = str1.length();
// Length of str2
int m = str2.length();
// If both strings have equal length
if (n == m)
{
return 2 * fact(n) * fact(m);
}
// If both strings do not have
// equal length
return fact(n) * fact(m);
} // Driver code public static void main (String[] args)
{ String str1 = "aegh" ;
String str2 = "rsw" ;
System.out.print(distinctWays(str1, str2));
} } // This code is contributed by code_hunt |
# Python3 program to implement # the above approach # Function to get the # factorial of N def fact(n):
res = 1
for i in range ( 1 , n + 1 ):
res = res * i
return res
# Function to get the total # number of distinct ways def distinctWays(str1, str2):
# Length of str1
n = len (str1)
# Length of str2
m = len (str2)
# If both strings have equal length
if (n = = m):
return 2 * fact(n) * fact(m)
# If both strings do not have
# equal length
return fact(n) * fact(m)
# Driver code str1 = "aegh"
str2 = "rsw"
print (distinctWays(str1, str2))
# This code is contributed by code_hunt |
// C# program to implement // the above approach using System;
class GFG{
// Function to get the // factorial of N static int fact( int n)
{ int res = 1;
for ( int i = 1; i <= n; i++)
{
res = res * i;
}
return res;
} // Function to get the total // number of distinct ways static int distinctWays( string str1,
string str2)
{ // Length of str1
int n = str1.Length;
// Length of str2
int m = str2.Length;
// If both strings have equal length
if (n == m)
{
return 2 * fact(n) * fact(m);
}
// If both strings do not have
// equal length
return fact(n) * fact(m);
} // Driver code public static void Main ()
{ string str1 = "aegh" ;
string str2 = "rsw" ;
Console.Write(distinctWays(str1, str2));
} } // This code is contributed by code_hunt |
<script> // JavaScript program to implement // the above approach // Function to get the
// factorial of N
function fact(n) {
var res = 1;
for (i = 1; i <= n; i++) {
res = res * i;
}
return res;
}
// Function to get the total
// number of distinct ways
function distinctWays( str1, str2) {
// Length of str1
var n = str1.length;
// Length of str2
var m = str2.length;
// If both strings have equal length
if (n == m) {
return 2 * fact(n) * fact(m);
}
// If both strings do not have
// equal length
return fact(n) * fact(m);
}
// Driver code
var str1 = "aegh" ;
var str2 = "rsw" ;
document.write(distinctWays(str1, str2));
// This code is contributed by todaysgaurav </script> |
144
Time Complexity: O(N + M)
Auxiliary Space: O(1)