Number of strings of length N with no palindromic sub string
Last Updated :
22 Nov, 2022
Given two positive integers N, M. The task is to find the number of strings of length N under the alphabet set of size M such that no substrings of size greater than 1 is palindromic.
Examples:
Input : N = 2, M = 3
Output : 6
In this case, set of alphabet are 3, say {A, B, C}
All possible string of length 2, using 3 letters are:
{AA, AB, AC, BA, BB, BC, CA, CB, CC}
Out of these {AA, BB, CC} contain palindromic substring,
so our answer will be
8 - 2 = 6.
Input : N = 2, M = 2
Output : 2
Out of {AA, BB, AB, BA}, only {AB, BA} contain
non-palindromic substrings.
First, observe, a string does not contain any palindromic substring if the string doesn’t have any palindromic substring of the length 2 and 3, because all the palindromic string of the greater lengths contains at least one palindromic substring of the length of 2 or 3, basically in the center.
So, the following is true:
- There are M ways to choose the first symbol of the string.
- Then there are (M – 1) ways to choose the second symbol of the string. Basically, it should not be equal to first one.
- Then there are (M – 2) ways to choose any next symbol. Basically, it should not coincide with the previous symbols, that aren’t equal.
Knowing this, we can evaluate the answer in the following ways:
- If N = 1, then the answer will be M.
- If N = 2, then the answer is M*(M – 1).
- If N >= 3, then M * (M – 1) * (M – 2)N-2.
Below is the implementation of above idea :
C++
#include <bits/stdc++.h>
using namespace std;
int numofstring( int n, int m)
{
if (n == 1)
return m;
if (n == 2)
return m * (m - 1);
return m * (m - 1) * pow (m - 2, n - 2);
}
int main()
{
int n = 2, m = 3;
cout << numofstring(n, m) << endl;
return 0;
}
|
Java
import java.io.*;
class GFG {
static int numofstring( int n, int m)
{
if (n == 1 )
return m;
if (n == 2 )
return m * (m - 1 );
return m * (m - 1 ) * ( int )Math.pow(m - 2 , n - 2 );
}
public static void main (String[] args)
{
int n = 2 , m = 3 ;
System.out.println(numofstring(n, m));
}
}
|
Python3
def numofstring(n, m):
if n = = 1 :
return m
if n = = 2 :
return m * (m - 1 )
return m * (m - 1 ) * pow (m - 2 , n - 2 )
n = 2
m = 3
print (numofstring(n, m))
|
C#
using System;
class GFG {
static int numofstring( int n, int m)
{
if (n == 1)
return m;
if (n == 2)
return m * (m - 1);
return m * (m - 1) * ( int )Math.Pow(m - 2,
n - 2);
}
public static void Main ()
{
int n = 2, m = 3;
Console.Write(numofstring(n, m));
}
}
|
PHP
<?php
function numofstring( $n , $m )
{
if ( $n == 1)
return $m ;
if ( $n == 2)
return $m * ( $m - 1);
return $m * ( $m - 1) *
pow( $m - 2, $n - 2);
}
{
$n = 2; $m = 3;
echo numofstring( $n , $m ) ;
return 0;
}
?>
|
Javascript
<script>
function numofstring(n, m)
{
if (n == 1)
return m;
if (n == 2)
return m * (m - 1);
return m * (m - 1) * Math.pow(m - 2, n - 2);
}
let n = 2, m = 3;
document.write(numofstring(n, m));
</script>
|
Time Complexity: O(log n), for using of pow function where n is the given input.
Auxiliary Space: O(1), no extra space is required, so it is a constant.
Share your thoughts in the comments
Please Login to comment...