Count ways to place all the characters of two given strings alternately
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++
// 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
// 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
# 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#
// 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 |
Javascript
<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)