Find all palindromic sub-strings of a given string | Set 2
Last Updated :
24 Mar, 2023
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++
// c++ program to Count number of ways we
// can get palindrome string from a given
// string
#include<bits/stdc++.h>
using namespace std;
// function to find the substring of the
// string
string substring(string s,int a,int b)
{
string s1="";
// extract the specified position of
// the string
for(int i = a; i < b; i++)
s1 = s1 + s[i];
return s1;
}
// can get palindrome string from a
// given string
vector<string> allPalindromeSubstring(string s)
{
vector<string> v ;
// moving the pivot from starting till
// end of the string
for (float pivot = 0; pivot < s.length();
pivot += .5)
{
// set radius to the first nearest
// element on left and right
float palindromeRadius = pivot -
(int)pivot;
// if the position needs to be
// compared has an element and the
// characters at left and right
// matches
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)));
// increasing the radius by 1 to point
// to the next elements in left and right
palindromeRadius++;
}
}
return v;
}
// Driver code
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] << ",";
}
// This code is contributed by Arnab Kundu.
Java
// Java program to Count number of ways we
// can get palindrome string from a given string
import java.util.ArrayList;
import java.util.List;
public class AllPalindromeSubstringsPossible {
public static List<String> allPalindromeSubstring(String s)
{
List<String> list = new ArrayList<String>();
// moving the pivot from starting till end of the string
for (float pivot = 0; pivot < s.length(); pivot += .5) {
// set radius to the first nearest element
// on left and right
float palindromeRadius = pivot - (int)pivot;
// if the position needs to be compared has an element
// and the characters at left and right matches
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)));
// increasing the radius by 1 to point to the
// next elements in left and right
palindromeRadius++;
}
}
return list;
}
// Drivers code
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
# Python3 program to Count number of ways we
# can get palindrome string from a given
# string
# function to find the substring of the
# string
def substring(s, a, b):
s1 = ""
# extract the specified position of
# the string
for i in range(a, b, 1):
s1 += s[i]
return s1
# can get palindrome string from a
# given string
def allPalindromeSubstring(s):
v = []
# moving the pivot from starting till
# end of the string
pivot = 0.0
while pivot < len(s):
# set radius to the first nearest
# element on left and right
palindromeRadius = pivot - int(pivot)
# if the position needs to be
# compared has an element and the
# characters at left and right
# matches
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)])
# increasing the radius by 1 to point
# to the next elements in left and right
palindromeRadius += 1
pivot += 0.5
return v
# Driver Code
if __name__ == "__main__":
v = allPalindromeSubstring("hellolle")
print(len(v))
print(v)
v = allPalindromeSubstring("geeksforgeeks")
print(len(v))
print(v)
# This code is contributed by
# sanjeev2552
C#
// C# program to Count number of ways we
// can get palindrome string from a given string
using System;
using System.Collections.Generic;
public class AllPalindromeSubstringsPossible
{
public static List<String> allPalindromeSubstring(String s)
{
List<String> list = new List<String>();
// moving the pivot from starting till end of the string
for (float pivot = 0; pivot < s.Length; pivot+= (float).5)
{
// set radius to the first nearest element
// on left and right
float palindromeRadius = pivot - (int)pivot;
// if the position needs to be compared has an element
// and the characters at left and right matches
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)));
// increasing the radius by 1 to point to the
// next elements in left and right
palindromeRadius++;
}
}
return list;
}
// Drivers code
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]+",");
}
}
/* This code contributed by PrinciRaj1992 */
JavaScript
<script>
// JavaScript program to Count number of ways we
// can get palindrome string from a given string
function allPalindromeSubstring(s)
{
let list = [];
// moving the pivot from starting till end of the string
for (let pivot = 0; pivot < s.length; pivot += .5) {
// set radius to the first nearest element
// on left and right
let palindromeRadius = pivot - Math.floor(pivot);
// if the position needs to be compared has an element
// and the characters at left and right matches
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)));
// increasing the radius by 1 to point to the
// next elements in left and right
palindromeRadius++;
}
}
return list;
}
// Drivers code
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>");
// This code is contributed by avanitrachhadiya2155
</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.
Similar Reads
Palindrome String Coding Problems
A string is called a palindrome if the reverse of the string is the same as the original one.Example: âmadamâ, âracecarâ, â12321â.Palindrome StringProperties of a Palindrome String:A palindrome string has some properties which are mentioned below:A palindrome string has a symmetric structure which m
2 min read
Palindrome String
Given a string s, the task is to check if it is palindrome or not.Example:Input: s = "abba"Output: 1Explanation: s is a palindromeInput: s = "abc" Output: 0Explanation: s is not a palindromeUsing Two-Pointers - O(n) time and O(1) spaceThe idea is to keep two pointers, one at the beginning (left) and
13 min read
Check Palindrome by Different Language
Easy Problems on Palindrome
Sentence Palindrome
Given a sentence s, the task is to check if it is a palindrome sentence or not. A palindrome sentence is a sequence of characters, such as a word, phrase, or series of symbols, that reads the same backward as forward after converting all uppercase letters to lowercase and removing all non-alphanumer
9 min read
Check if actual binary representation of a number is palindrome
Given a non-negative integer n. The problem is to check if binary representation of n is palindrome or not. Note that the actual binary representation of the number is being considered for palindrome checking, no leading 0âs are being considered. Examples : Input : 9 Output : Yes (9)10 = (1001)2 Inp
6 min read
Print longest palindrome word in a sentence
Given a string str, the task is to print longest palindrome word present in the string str.Examples: Input : Madam Arora teaches Malayalam Output: Malayalam Explanation: The string contains three palindrome words (i.e., Madam, Arora, Malayalam) but the length of Malayalam is greater than the other t
14 min read
Count palindrome words in a sentence
Given a string str and the task is to count palindrome words present in the string str. Examples: Input : Madam Arora teaches malayalam Output : 3 The string contains three palindrome words (i.e., Madam, Arora, malayalam) so the count is three. Input : Nitin speaks malayalam Output : 2 The string co
5 min read
Check if characters of a given string can be rearranged to form a palindrome
Given a string, Check if the characters of the given string can be rearranged to form a palindrome. For example characters of "geeksogeeks" can be rearranged to form a palindrome "geeksoskeeg", but characters of "geeksforgeeks" cannot be rearranged to form a palindrome. Recommended PracticeAnagram P
14 min read
Lexicographically first palindromic string
Rearrange the characters of the given string to form a lexicographically first palindromic string. If no such string exists display message "no palindromic string". Examples: Input : malayalam Output : aalmymlaa Input : apple Output : no palindromic string Simple Approach: 1. Sort the string charact
13 min read