# 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:8Explanations:

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 ofstr2=M!.

Therefore, the total number of ways to place all the characters ofstr1andstr2alternatively 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 ofstr2=M!

Now,

There are two cases possible here:

- First place the character of
str1and then place the character ofstr2.- First place the character of
str2and then place the character ofstr1.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>` |

**Output:**

144

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