Shortest Palindromic Substring

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++
Java
Python3
C#
Javascript
// C++ program to find the shortest// palindromic substring#include <bits/stdc++.h>using namespace std; // Function return the shortest// palindromic substringstring ShortestPalindrome(string s){    int n = s.length();         vector<string> 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[0];         // 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 codeint main(){    string s = "geeksforgeeks";         cout << ShortestPalindrome(s);         return 0;}
// Java program to find the shortest// palindromic substringimport java.util.*;import java.io.*; class GFG{ // Function return the shortest// palindromic substringpublic static String ShortestPalindrome(String s){    int n = s.length();    Vector<String> v = new Vector<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.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 codepublic static void main(String []args){    String s = "geeksforgeeks";         System.out.println(ShortestPalindrome(s));}} // This code is contributed by rag2127
# Python3 program to find the shortest# palindromic substring # Function return the shortest# palindromic substringdef 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# program to find the shortest// palindromic substringusing 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[0];     // Smallest substring which is    // not empty    for(int i = 0; i < v.Count; i++)    {      if(v[i] != "")      {        if(ans[0] >= v[i][0])        {          ans = v[i];        }      }    }    return ans;  }     // Driver code  static public void Main ()  {    string s = "geeksforgeeks";    Console.WriteLine(ShortestPalindrome(s));  }} // This code is contributed by avanitrachhadiya2155
<script>    // Javascript program to find the shortest    // palindromic substring         // Function return the shortest    // palindromic substring    function ShortestPalindrome(s)    {      let n = s.length;      let v = [];       // One by one consider every character      // as center point of even and length      // palindromes        for(let i = 0; i < n; i++)      {        let l = i;        let r = i;        let ans1 = "";        let 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(ans1);        v.push(ans2);      }      let ans = v[0];       // Smallest substring which is      // not empty      for(let i = 0; i < v.length; i++)      {        if(v[i] != "")        {          if(ans[0] >= v[i][0])          {            ans = v[i];          }        }      }      return ans;    }         let s = "geeksforgeeks";    document.write(ShortestPalindrome(s));         // This code is contributed by decode2207.</script>
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++
Java
Python3
C#
Javascript
// C++ program to find the shortest// palindromic substring#include <bits/stdc++.h>using namespace std; // Function return the shortest// palindromic substringchar ShortestPalindrome(string s){    int n = s.length();    char ans = s[0];         // Finding the smallest character    // present in the string    for(int i = 1; i < n ; i++)    {        ans = min(ans, s[i]);    }         return ans;} // Driver codeint main(){    string s = "geeksforgeeks";         cout << ShortestPalindrome(s);         return 0;}
// Java program to find the shortest// palindromic subString class GFG{ // Function return the shortest// palindromic subStringstatic 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 codepublic static void main(String[] args){    String s = "geeksforgeeks";    System.out.print(ShortestPalindrome(s));}} // This code is contributed by Rajput-Ji
# Python3 program to find the shortest# palindromic substring # Function return the shortest# palindromic substringdef 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 codes = "geeksforgeeks"       print(ShortestPalindrome(s)) # This code is contributed by divyeshrabadiya07
// C# program to find the shortest// palindromic subStringusing System; class GFG{ // Function return the shortest// palindromic subStringstatic char ShortestPalindrome(String s){    int n = s.Length;    char ans = s[0];         // 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 codepublic static void Main(String[] args){    String s = "geeksforgeeks";    Console.Write(ShortestPalindrome(s));}} // This code is contributed by 29AjayKumar
<script> // Javascript program to find the shortest// palindromic subString // Function return the shortest// palindromic subStringfunction ShortestPalindrome(s){    let n = s.length;    let ans = s[0].charCodeAt();     // Finding the smallest character    // present in the String    for(let i = 1; i < n; i++)    {        ans = Math.min(ans, s[i].charCodeAt());    }    return String.fromCharCode(ans);} // Driver codelet s = "geeksforgeeks";document.write(ShortestPalindrome(s)); // This code is contributed by suresh07 </script>
e
 
Time complexity: O(N), where N is the length of the string. 
Rajput-Ji
29AjayKumar
divyeshrabadiya07
divyesh072019
rag2127
avanitrachhadiya2155
suresh07
decode2207
surindertarika1234
palindrome
substring
Analysis
Strings
Strings
palindrome
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.