Related Articles

# Shortest Palindromic Substring

• Difficulty Level : Easy
• Last Updated : 14 Sep, 2021

Given a string you need to find the shortest palindromic substring of the string. If there are multiple answers output the lexicographically smallest.

Examples:

```Input: zyzz
Output:y

Input: abab
Output: a```

Naive Approach:

• The approach is similar to finding the longest palindromic substring. We keep track of even and odd lengths substring and keep storing it in a vector.
• After that, we will sort the vector and print the lexicographically smallest substring. This may also include empty substrings but we need to ignore them.

Below is the implementation of the above approach:

## C++

 `// C++ program to find the shortest``// palindromic substring``#include ``using` `namespace` `std;` `// Function return the shortest``// palindromic substring``string ShortestPalindrome(string s)``{``    ``int` `n = s.length();``    ` `    ``vector v;``    ` `    ``// One by one consider every character ``    ``// as center point of even and length``    ``// palindromes``    ``for` `(``int` `i = 0; i < n; i++)``    ``{``        ``int` `l = i;``        ``int` `r = i;``        ``string ans1 = ``""``;``        ``string ans2 = ``""``;``        ` `        ``// Find the longest odd length palindrome``        ``// with center point as i``        ``while` `(l >= 0 && r < n && s[l] == s[r])``        ``{``            ``ans1 += s[l];``            ``l--;``            ``r++;``        ``}``        ``l = i - 1;``        ``r = i;``        ` `        ``// Find the even length palindrome ``        ``// with center points as i-1 and i.``        ``while` `(l >= 0 && r < n && s[l] == s[r])``        ``{``            ``ans2 += s[l];``            ``l--;``            ``r++;``        ``}``        ``v.push_back(ans1);``        ``v.push_back(ans2);``    ``}``    ``string ans = v;``    ` `    ``// Smallest substring which is``    ``// not empty``    ``for` `(``int` `i = 0; i < v.size(); i++)``    ``{``        ``if` `(v[i] != ``""``)``        ``{``            ``ans = min(ans, v[i]);``        ``}``    ``}``    ``return` `ans;``}` `// Driver code``int` `main()``{``    ``string s = ``"geeksforgeeks"``;``    ` `    ``cout << ShortestPalindrome(s);``    ` `    ``return` `0;``}`

## Java

 `// Java program to find the shortest``// palindromic substring``import` `java.util.*;``import` `java.io.*;` `class` `GFG{` `// Function return the shortest``// palindromic substring``public` `static` `String ShortestPalindrome(String s)``{``    ``int` `n = s.length();``    ``Vector v = ``new` `Vector();``    ` `    ``// One by one consider every character ``    ``// as center point of even and length``    ``// palindromes``    ``for``(``int` `i = ``0``; i < n; i++)``    ``{``        ``int` `l = i;``        ``int` `r = i;``        ``String ans1 = ``""``;``        ``String ans2 = ``""``;``        ` `        ``// Find the longest odd length palindrome``        ``// with center point as i    ``        ``while` `(l >= ``0` `&& r < n &&``          ``s.charAt(l) == s.charAt(r))``        ``{``            ``ans1 += s.charAt(l);``            ``l--;``            ``r++;``        ``}``        ``l = i - ``1``;``        ``r = i;``        ` `        ``// Find the even length palindrome ``        ``// with center points as i-1 and i.``        ``while` `(l >= ``0` `&& r < n &&``          ``s.charAt(l) == s.charAt(r))``        ``{``            ``ans2 += s.charAt(l);``            ``l--;``            ``r++;``        ``}``        ` `        ``v.add(ans1);``        ``v.add(ans2);``    ``}``    ` `    ``String ans = v.get(``0``);``    ` `    ``// Smallest substring which is``    ``// not empty``    ``for``(``int` `i = ``0``; i < v.size(); i++)``    ``{``        ``if` `(v.get(i) != ``""``)``        ``{``            ``if` `(ans.charAt(``0``) >=``                ``v.get(i).charAt(``0``))``            ``{``                ``ans = v.get(i);``            ``}``        ``}``    ``}``    ``return` `ans;``}` `// Driver code``public` `static` `void` `main(String []args)``{``    ``String s = ``"geeksforgeeks"``;``    ` `    ``System.out.println(ShortestPalindrome(s));``}``}` `// This code is contributed by rag2127`

## Python3

 `# Python3 program to find the shortest``# palindromic substring` `# Function return the shortest``# palindromic substring``def` `ShortestPalindrome(s) :` `    ``n ``=` `len``(s)``    ` `    ``v ``=` `[]``    ` `    ``# One by one consider every character``    ``# as center point of even and length``    ``# palindromes``    ``for` `i ``in` `range``(n) :``    ` `        ``l ``=` `i``        ``r ``=` `i``        ``ans1 ``=` `""``        ``ans2 ``=` `""``        ` `        ``# Find the longest odd length palindrome``        ``# with center point as i``        ``while` `((l >``=` `0``) ``and` `(r < n) ``and` `(s[l] ``=``=` `s[r])) :``        ` `            ``ans1 ``+``=` `s[l]``            ``l ``-``=` `1``            ``r ``+``=` `1` `        ``l ``=` `i ``-` `1``        ``r ``=` `i``        ` `        ``# Find the even length palindrome``        ``# with center points as i-1 and i.``        ``while` `((l >``=` `0``) ``and` `(r < n) ``and` `(s[l] ``=``=` `s[r])) :``        ` `            ``ans2 ``+``=` `s[l]``            ``l ``-``=` `1``            ``r ``+``=` `1` `        ``v.append(ans1)``        ``v.append(ans2)``    ` `    ``ans ``=` `v[``0``]``    ` `    ``# Smallest substring which is``    ``# not empty``    ``for` `i ``in` `range``(``len``(v)) :``    ` `        ``if` `(v[i] !``=` `"") :``        ` `            ``ans ``=` `min``(ans, v[i])` `    ``return` `ans``    `  `s ``=` `"geeksforgeeks"` `print``(ShortestPalindrome(s))` `# This code is contributed by divyesh072019`

## C#

 `// C# program to find the shortest``// palindromic substring``using` `System;``using` `System.Collections.Generic;``class` `GFG``{``  ` `  ``// Function return the shortest``  ``// palindromic substring``  ``static` `string` `ShortestPalindrome(``string` `s)``  ``{``    ``int` `n = s.Length;``    ``List<``string``> v = ``new` `List<``string``>();``    ` `    ``// One by one consider every character ``    ``// as center point of even and length``    ``// palindromes   ``    ``for``(``int` `i = 0; i < n; i++)``    ``{``      ``int` `l = i;``      ``int` `r = i;``      ``string` `ans1 = ``""``;``      ``string` `ans2 = ``""``;``      ` `      ``// Find the longest odd length palindrome``      ``// with center point as i       ``      ``while``(l >= 0 && r < n && s[l] == s[r])``      ``{``        ``ans1 += s[l];``        ``l--;``        ``r++;``      ``}``      ``l = i - 1;``      ``r = i;` `      ``// Find the even length palindrome ``      ``// with center points as i-1 and i.``      ``while``(l >= 0 && r < n && s[l] == s[r])``      ``{``        ``ans2 += s[l];``        ``l--;``        ``r++;``      ``}``      ``v.Add(ans1);``      ``v.Add(ans2);``    ``}``    ``string` `ans = v;` `    ``// Smallest substring which is``    ``// not empty``    ``for``(``int` `i = 0; i < v.Count; i++)``    ``{``      ``if``(v[i] != ``""``)``      ``{``        ``if``(ans >= v[i])``        ``{``          ``ans = v[i];``        ``}``      ``}``    ``}``    ``return` `ans;``  ``}``  ` `  ``// Driver code``  ``static` `public` `void` `Main ()``  ``{``    ``string` `s = ``"geeksforgeeks"``;``    ``Console.WriteLine(ShortestPalindrome(s));``  ``}``}` `// This code is contributed by avanitrachhadiya2155`

## Javascript

 ``
Output:

`e`

Time complexity: O(N^2), where N is the length of the string.

Efficient Approach:

• An observation here is that a single character is also a palindrome. So, we just need to print the lexicographically smallest character present in the string.

Below is the implementation of the above approach:

## C++

 `// C++ program to find the shortest``// palindromic substring``#include ``using` `namespace` `std;` `// Function return the shortest``// palindromic substring``char` `ShortestPalindrome(string s)``{``    ``int` `n = s.length();``    ``char` `ans = s;``    ` `    ``// Finding the smallest character``    ``// present in the string``    ``for``(``int` `i = 1; i < n ; i++)``    ``{``        ``ans = min(ans, s[i]);``    ``}``    ` `    ``return` `ans;``}` `// Driver code``int` `main()``{``    ``string s = ``"geeksforgeeks"``;``    ` `    ``cout << ShortestPalindrome(s);``    ` `    ``return` `0;``}`

## Java

 `// Java program to find the shortest``// palindromic subString` `class` `GFG{` `// Function return the shortest``// palindromic subString``static` `char` `ShortestPalindrome(String s)``{``    ``int` `n = s.length();``    ``char` `ans = s.charAt(``0``);``    ` `    ``// Finding the smallest character``    ``// present in the String``    ``for``(``int` `i = ``1``; i < n; i++)``    ``{``        ``ans = (``char``) Math.min(ans, s.charAt(i));``    ``}``    ``return` `ans;``}` `// Driver code``public` `static` `void` `main(String[] args)``{``    ``String s = ``"geeksforgeeks"``;``    ``System.out.print(ShortestPalindrome(s));``}``}` `// This code is contributed by Rajput-Ji`

## Python3

 `# Python3 program to find the shortest``# palindromic substring` `# Function return the shortest``# palindromic substring``def` `ShortestPalindrome(s):` `    ``n ``=` `len``(s)``    ``ans ``=` `s[``0``]``      ` `    ``# Finding the smallest character``    ``# present in the string``    ``for` `i ``in` `range``(``1``, n):``        ``ans ``=` `min``(ans, s[i])` `    ``return` `ans` `# Driver code``s ``=` `"geeksforgeeks"``      ` `print``(ShortestPalindrome(s))` `# This code is contributed by divyeshrabadiya07`

## C#

 `// C# program to find the shortest``// palindromic subString``using` `System;` `class` `GFG{` `// Function return the shortest``// palindromic subString``static` `char` `ShortestPalindrome(String s)``{``    ``int` `n = s.Length;``    ``char` `ans = s;``    ` `    ``// Finding the smallest character``    ``// present in the String``    ``for``(``int` `i = 1; i < n; i++)``    ``{``        ``ans = (``char``) Math.Min(ans, s[i]);``    ``}``    ``return` `ans;``}` `// Driver code``public` `static` `void` `Main(String[] args)``{``    ``String s = ``"geeksforgeeks"``;``    ``Console.Write(ShortestPalindrome(s));``}``}` `// This code is contributed by 29AjayKumar`

## Javascript

 ``
Output:
`e`

Time complexity: O(N), where N is the length of the string.

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.

My Personal Notes arrow_drop_up