Count all Prime Length Palindromic Substrings
Last Updated :
30 Mar, 2023
Given string str, the task is to count all the sub-strings of str which are palindromes and their length is prime.
Examples:
Input: str = “geeksforgeeks”
Output: 2
“ee” and “ee” are the only valid sub-strings.
Input: str = “abccc”
Output: 3
Approach: Using Sieve of Eratosthenes, find all the primes till the length of str because that is the maximum length a sub-string of str can have. Now starting from the smallest prime i.e. j = 2 till j ? len(str). If j is prime then count all the palindromic sub-strings of str whose length = j. Print the total count at the end.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool isPalindrome(string str, int i, int j)
{
while (i < j) {
if (str[i] != str[j])
return false ;
i++;
j--;
}
return true ;
}
int countPrimePalindrome(string str, int len)
{
bool prime[len + 1];
memset (prime, true , sizeof (prime));
prime[0] = prime[1] = false ;
for ( int p = 2; p * p <= len; p++) {
if (prime[p]) {
for ( int i = p * p; i <= len; i += p)
prime[i] = false ;
}
}
int count = 0;
for ( int j = 2; j <= len; j++) {
if (prime[j]) {
for ( int i = 0; i + j - 1 < len; i++) {
if (isPalindrome(str, i, i + j - 1))
count++;
}
}
}
return count;
}
int main()
{
string s = "geeksforgeeks" ;
int len = s.length();
cout << countPrimePalindrome(s, len);
return 0;
}
|
Java
import java.util.Arrays;
class GfG
{
static boolean isPalindrome(String str, int i, int j)
{
while (i < j)
{
if (str.charAt(i) != str.charAt(j))
return false ;
i++;
j--;
}
return true ;
}
static int countPrimePalindrome(String str, int len)
{
boolean [] prime = new boolean [len + 1 ];
Arrays.fill(prime, true );
prime[ 0 ] = prime[ 1 ] = false ;
for ( int p = 2 ; p * p <= len; p++)
{
if (prime[p])
{
for ( int i = p * p; i <= len; i += p)
prime[i] = false ;
}
}
int count = 0 ;
for ( int j = 2 ; j <= len; j++)
{
if (prime[j])
{
for ( int i = 0 ; i + j - 1 < len; i++)
{
if (isPalindrome(str, i, i + j - 1 ))
count++;
}
}
}
return count;
}
public static void main(String []args)
{
String s = "geeksforgeeks" ;
int len = s.length();
System.out.println(countPrimePalindrome(s, len));
}
}
|
Python3
import math as mt
def isPalindrome(str1, i, j):
while (i < j):
if (str1[i] ! = str1[j]):
return False
i + = 1
j - = 1
return True
def countPrimePalindrome(str1, Len ):
prime = [ True for i in range ( Len + 1 )]
prime[ 0 ], prime[ 1 ] = False , False
for p in range ( 2 , mt.ceil(mt.sqrt( Len + 1 ))):
if (prime[p]):
for i in range ( 2 * p, Len + 1 , p):
prime[i] = False
count = 0
for j in range ( 2 , Len + 1 ):
if (prime[j]):
for i in range ( Len + 1 - j):
if (isPalindrome(str1, i, i + j - 1 )):
count + = 1
return count
s = "geeksforgeeks"
Len = len (s)
print ( countPrimePalindrome(s, Len ))
|
C#
using System;
class GfG
{
static bool isPalindrome( string str,
int i, int j)
{
while (i < j)
{
if (str[i] != str[j])
return false ;
i++;
j--;
}
return true ;
}
static int countPrimePalindrome( string str,
int len)
{
bool [] prime = new bool [len + 1];
Array.Fill(prime, true );
prime[0] = prime[1] = false ;
for ( int p = 2; p * p <= len; p++)
{
if (prime[p])
{
for ( int i = p * p; i <= len; i += p)
prime[i] = false ;
}
}
int count = 0;
for ( int j = 2; j <= len; j++)
{
if (prime[j])
{
for ( int i = 0;
i + j - 1 < len; i++)
{
if (isPalindrome(str, i, i + j - 1))
count++;
}
}
}
return count;
}
public static void Main()
{
string s = "geeksforgeeks" ;
int len = s.Length;
Console.WriteLine(countPrimePalindrome(s, len));
}
}
|
Javascript
<script>
function isPalindrome(str, i, j)
{
while (i < j) {
if (str[i] != str[j])
return false ;
i++;
j--;
}
return true ;
}
function countPrimePalindrome(str, len)
{
var prime = Array(len + 1).fill( true );
prime[0] = prime[1] = false ;
for ( var p = 2; p * p <= len; p++) {
if (prime[p]) {
for ( var i = p * p; i <= len; i += p)
prime[i] = false ;
}
}
var count = 0;
for ( var j = 2; j <= len; j++) {
if (prime[j]) {
for ( var i = 0; i + j - 1 < len; i++) {
if (isPalindrome(str, i, i + j - 1))
count++;
}
}
}
return count;
}
var s = "geeksforgeeks" ;
var len = s.length;
document.write( countPrimePalindrome(s, len));
</script>
|
PHP
<?php
function isPalindrome( $str , $i , $j )
{
while ( $i < $j )
{
if ( $str [ $i ] != $str [ $j ])
return false;
$i ++;
$j --;
}
return true;
}
function countPrimePalindrome( $str , $len )
{
$prime = array_fill (0, $len + 1, true);
$prime [0] = false ;
$prime [1] = false;
for ( $p = 2; $p * $p <= $len ; $p ++)
{
if ( $prime [ $p ])
{
for ( $i = $p * $p ; $i <= $len ; $i += $p )
$prime [ $i ] = false;
}
}
$count = 0;
for ( $j = 2; $j <= $len ; $j ++)
{
if ( $prime [ $j ])
{
for ( $i = 0; $i + $j - 1 < $len ; $i ++)
{
if (isPalindrome( $str , $i , $i + $j - 1))
$count ++;
}
}
}
return $count ;
}
$s = "geeksforgeeks" ;
$len = strlen ( $s );
echo countPrimePalindrome( $s , $len );
?>
|
Python program to count all prime length palindromic substrings :
Approach steps:
1.Define a function count_palindromic_substrings that takes a string s as input. The function will return the count of all prime length palindromic substrings in s.
2.Define a helper function is_palindrome that takes a string s as input and returns True if s is a palindrome, and False otherwise. This function checks if the string is equal to its reverse.
3.Initialize a variable count to 0 to keep track of the total count of prime length palindromic substrings.
4.Iterate over all possible substring lengths p from 2 to n (length of s), and check if p is a prime number using a loop that runs from 2 to the square root of p. If p is a prime number, iterate over all substrings of length p and check if each substring is a palindrome using the is_palindrome helper function. If the substring is a palindrome, increment the count variable.
5.Return the total count of prime length palindromic substrings.
6.In the example usage, create a string s and call the count_palindromic_substrings function with this argument. Finally, print the total count of prime length palindromic substrings.
C++
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
bool is_palindrome(string s) {
return s == string(s.rbegin(), s.rend());
}
int count_palindromic_substrings(string s) {
int count = 0;
int n = s.length();
for ( int p = 2; p <= n; p++) {
bool is_prime = true ;
for ( int i = 2; i <= sqrt (p); i++) {
if (p % i == 0) {
is_prime = false ;
break ;
}
}
if (is_prime) {
for ( int i = 0; i <= n - p; i++) {
if (is_palindrome(s.substr(i, p))) {
count++;
}
}
}
}
return count;
}
int main() {
string s = "abccba" ;
int count = count_palindromic_substrings(s);
cout << "Total number of prime length palindromic substrings in " << s << " is " << count << endl;
return 0;
}
|
Java
import java.util.*;
public class Main {
public static boolean isPalindrome(String s) {
return s.equals( new StringBuilder(s).reverse().toString());
}
public static int countPalindromicSubstrings(String s) {
int count = 0 ;
int n = s.length();
for ( int p = 2 ; p <= n; p++) {
boolean isPrime = true ;
for ( int i = 2 ; i <= Math.sqrt(p); i++) {
if (p % i == 0 ) {
isPrime = false ;
break ;
}
}
if (isPrime) {
for ( int i = 0 ; i <= n - p; i++) {
if (isPalindrome(s.substring(i, i + p))) {
count++;
}
}
}
}
return count;
}
public static void main(String[] args) {
String s = "abccba" ;
int count = countPalindromicSubstrings(s);
System.out.println( "Total number of prime length palindromic substrings in " + s + " is " + count);
}
}
|
Python3
def count_palindromic_substrings(s):
def is_palindrome(s):
return s = = s[:: - 1 ]
count = 0
n = len (s)
for p in range ( 2 , n + 1 ):
is_prime = True
for i in range ( 2 , int (p * * 0.5 ) + 1 ):
if p % i = = 0 :
is_prime = False
break
if is_prime:
for i in range (n - p + 1 ):
if is_palindrome(s[i:i + p]):
count + = 1
return count
s = "abccba"
count = count_palindromic_substrings(s)
print ( "Total number of prime length palindromic substrings in" , s, "is" , count)
|
Javascript
function count_palindromic_substrings(s) {
function is_palindrome(s) {
return s === s.split( "" ).reverse().join( "" );
}
let count = 0;
const n = s.length;
for (let p = 2; p <= n; p++) {
let is_prime = true ;
for (let i = 2; i <= Math.floor(Math.sqrt(p)); i++) {
if (p % i === 0) {
is_prime = false ;
break ;
}
}
if (is_prime) {
for (let i = 0; i <= n-p; i++) {
if (is_palindrome(s.substring(i, i+p))) {
count += 1;
}
}
}
}
return count;
}
const s = "abccba" ;
const count = count_palindromic_substrings(s);
console.log(`Total number of prime length palindromic substrings in ${s} is ${count}`);
|
C#
using System;
class MainClass {
public static bool isPalindrome( string s) {
char [] charArray = s.ToCharArray();
Array.Reverse(charArray);
return s == new string (charArray);
}
public static int countPalindromicSubstrings( string s) {
int count = 0;
int n = s.Length;
for ( int p = 2; p <= n; p++) {
bool isPrime = true ;
for ( int i = 2; i <= Math.Sqrt(p); i++) {
if (p % i == 0) {
isPrime = false ;
break ;
}
}
if (isPrime) {
for ( int i = 0; i <= n - p; i++) {
if (isPalindrome(s.Substring(i, p))) {
count++;
}
}
}
}
return count;
}
public static void Main ( string [] args) {
string s = "abccba" ;
int count = countPalindromicSubstrings(s);
Console.WriteLine( "Total number of prime length palindromic substrings in " + s + " is " + count);
}
}
|
Output
Total number of prime length palindromic substrings in abccba is 1
Time complexity: O(n^2 log n)
Auxiliary Space: O(1).
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...