Given a string, the task is to find all the palindromic sub-strings from the given string.
In Set – 1, another approach has been already discussed and that consider only distinct sub-strings but in this equal sub-strings i.e. ll and ll are considered as two sub-strings, not one.
Examples:
Input : hellolle
Output : 13
[h, e, l, ll, l, o, lol, lloll, ellolle, l, ll, l, e]
Explanation:
- ellolle
- ll, ll – Note that these are two distinct sub-strings that only happen to be equal
- lol and lloll
- And, of course, each letter can be considered a palindrome – all 8 of them.
Input : geeksforgeeks
Output : 15
[g, e, ee, e, k, s, f, o, r, g, e, ee, e, k, s]
Approach:
- We can have two types of palindrome strings that we need to handle -Even Length -Odd Length
- The idea is to consider a mid point and keep checking for the palindrome string by comparing the elements on the left and the elements on the right by increasing the distance or palindromeRadius by one at a time until there is a mismatch.
- The algorithm handles the even and odd length palindrome scenarios in a single pass.
- The pivot starts from 0 and moves till the end with a step size of 0.5.
- when the pivot is a non-fractional value, then the palindromeRadius values are integral starting from 0.
- when the pivot is a fractional value, then the palindromeRadius values are like 0.5, 1.5, 2.5, 3.5 ..
- So, each time we get a palindrome match, we put it in a list (so that the duplicate values are preserved because each duplicate sub-string is obtained by a different combination of alphabet positions)
Implementation:
C++
#include<bits/stdc++.h>
using namespace std;
string substring(string s, int a, int b)
{
string s1= "" ;
for ( int i = a; i < b; i++)
s1 = s1 + s[i];
return s1;
}
vector<string> allPalindromeSubstring(string s)
{
vector<string> v ;
for ( float pivot = 0; pivot < s.length();
pivot += .5)
{
float palindromeRadius = pivot -
( int )pivot;
while ((pivot + palindromeRadius)
< s.length() && (pivot - palindromeRadius)
>= 0 && s[(( int )(pivot - palindromeRadius))]
== s[(( int )(pivot + palindromeRadius))])
{
v.push_back(substring(s,( int )(pivot -
palindromeRadius), ( int )(pivot
+ palindromeRadius + 1)));
palindromeRadius++;
}
}
return v;
}
int main()
{
vector <string> v =
allPalindromeSubstring( "hellolle" );
cout << v.size() << endl;
for ( int i = 0; i < v.size(); i++)
cout << v[i] << "," ;
cout << endl;
v = allPalindromeSubstring( "geeksforgeeks" );
cout << v.size() << endl;
for ( int i = 0; i < v.size(); i++)
cout << v[i] << "," ;
}
|
Java
import java.util.ArrayList;
import java.util.List;
public class AllPalindromeSubstringsPossible {
public static List<String> allPalindromeSubstring(String s)
{
List<String> list = new ArrayList<String>();
for ( float pivot = 0 ; pivot < s.length(); pivot += . 5 ) {
float palindromeRadius = pivot - ( int )pivot;
while ((pivot + palindromeRadius) < s.length()
&& (pivot - palindromeRadius) >= 0
&& s.charAt(( int )(pivot - palindromeRadius))
== s.charAt(( int )(pivot + palindromeRadius))) {
list.add(s.substring(( int )(pivot - palindromeRadius),
( int )(pivot + palindromeRadius + 1 )));
palindromeRadius++;
}
}
return list;
}
public static void main(String[] args)
{
List<String> list = allPalindromeSubstring( "hellolle" );
System.out.println(list.size());
System.out.println(list);
list = allPalindromeSubstring( "geeksforgeeks" );
System.out.println(list.size());
System.out.println(list);
}
}
|
Python3
def substring(s, a, b):
s1 = ""
for i in range (a, b, 1 ):
s1 + = s[i]
return s1
def allPalindromeSubstring(s):
v = []
pivot = 0.0
while pivot < len (s):
palindromeRadius = pivot - int (pivot)
while ((pivot + palindromeRadius) < len (s) and
(pivot - palindromeRadius) > = 0 and
(s[ int (pivot - palindromeRadius)] = =
s[ int (pivot + palindromeRadius)])):
v.append(s[ int (pivot - palindromeRadius):
int (pivot + palindromeRadius + 1 )])
palindromeRadius + = 1
pivot + = 0.5
return v
if __name__ = = "__main__" :
v = allPalindromeSubstring( "hellolle" )
print ( len (v))
print (v)
v = allPalindromeSubstring( "geeksforgeeks" )
print ( len (v))
print (v)
|
C#
using System;
using System.Collections.Generic;
public class AllPalindromeSubstringsPossible
{
public static List<String> allPalindromeSubstring(String s)
{
List<String> list = new List<String>();
for ( float pivot = 0; pivot < s.Length; pivot+= ( float ).5)
{
float palindromeRadius = pivot - ( int )pivot;
while ((pivot + palindromeRadius) < s.Length
&& (pivot - palindromeRadius) >= 0
&& s[( int )(pivot - palindromeRadius)]
== s[( int )(pivot + palindromeRadius)])
{
list.Add(s.Substring(( int )(pivot - palindromeRadius),
( int )(pivot + palindromeRadius + 1)-
( int )(pivot - palindromeRadius)));
palindromeRadius++;
}
}
return list;
}
public static void Main(String[] args)
{
List<String> list = allPalindromeSubstring( "hellolle" );
Console.WriteLine(list.Count);
for ( int i = 0; i < list.Count; i++)
Console.Write(list[i]+ "," );
list = allPalindromeSubstring( "geeksforgeeks" );
Console.WriteLine( "\n" +list.Count);
for ( int i = 0; i < list.Count; i++)
Console.Write(list[i]+ "," );
}
}
|
Javascript
<script>
function allPalindromeSubstring(s)
{
let list = [];
for (let pivot = 0; pivot < s.length; pivot += .5) {
let palindromeRadius = pivot - Math.floor(pivot);
while ((pivot + palindromeRadius) < s.length
&& (pivot - palindromeRadius) >= 0
&& s[(Math.floor(pivot - palindromeRadius))]
== s[(Math.floor(pivot + palindromeRadius))])
{
list.push(s.substring(Math.floor(pivot -
palindromeRadius),
Math.floor(pivot + palindromeRadius + 1)));
palindromeRadius++;
}
}
return list;
}
let list = allPalindromeSubstring( "hellolle" );
document.write(list.length+ "<br>" );
document.write( "[" +list.join( ", " )+ "]<br>" );
list = allPalindromeSubstring( "geeksforgeeks" );
document.write(list.length+ "<br>" );
document.write( "[" +list.join( ", " )+ "]<br>" );
</script>
|
Output13
h,e,l,ll,l,o,lol,lloll,ellolle,l,ll,l,e,
15
g,e,ee,e,k,s,f,o,r,g,e,ee,e,k,s,
Complexity Analysis:
- Time Complexity : O(n3)
- Auxiliary Space: O(n)
Note: To print distinct substrings, use Set as it only takes distinct elements.
This article is contributed by Aarti_Rathi. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.