 Open in App
Not now

# 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