Related Articles

# Find all palindromic sub-strings of a given string | Set 2

• Difficulty Level : Hard
• Last Updated : 04 Aug, 2021

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:

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

Input : hellolle
Output : 13
[h, e, l, ll, l, o, lol, lloll, ellolle, l, ll, l, e]
Explanation:
1) ellolle
2) ll, ll – Note that these are two distinct sub-strings that only happen to be equal
3) lol and lloll
4) 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:
1- We can have two types of palindrome strings that we need to handle -Even Length -Odd Length
2- 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.
3- The algorithm handles the even and odd length palindrome scenarios in a single pass.
4- The pivot starts from 0 and moves till the end with a step size of 0.5.
…….a) when the pivot is a non-fractional value, then the palindromeRadius values are integral starting from 0.
…….b) when the pivot is a fractional value, then the palindromeRadius values are like 0.5, 1.5, 2.5, 3.5 ..
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)

## C++

 `// c++ program to Count number of ways we``// can get palindrome string from a given``// string``#include``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 allPalindromeSubstring(string s)``{``    ``vector 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 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 allPalindromeSubstring(String s)``    ``{``        ``List list = ``new` `ArrayList();` `        ``// 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 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 allPalindromeSubstring(String s)``    ``{``        ``List list = ``new` `List();` `        ``// 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 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

 ``
Output:
```13
[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]```

Note: To print distinct substrings, use Set as it only takes distinct elements.

My Personal Notes arrow_drop_up