# Count ways to place all the characters of two given strings alternately

• Last Updated : 07 Apr, 2021

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 ` `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

 ``

Output:

`144`

Time Complexity: O(N + M)
Auxiliary Space: O(1)

My Personal Notes arrow_drop_up
Recommended Articles
Page :