Open In App

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

Last Updated : 07 Apr, 2021
Comments
Improve
Suggest changes
Like Article
Like
Report

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.

Possible ways to place str1[] and str2[] alternatively

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:

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[]

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>

Output: 
144

 

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


Next Article

Similar Reads