Skip to content
Related Articles

Related Articles

Shortest Palindromic Substring
  • Difficulty Level : Easy
  • Last Updated : 23 Dec, 2020

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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the shortest
// palindromic substring
#include <bits/stdc++.h>
using namespace std;
 
// Function return the shortest
// palindromic substring
string 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 code
int main()
{
    string s = "geeksforgeeks";
     
    cout << ShortestPalindrome(s);
     
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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<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 code
public static void main(String []args)
{
    String s = "geeksforgeeks";
     
    System.out.println(ShortestPalindrome(s));
}
}
 
// This code is contributed by rag2127

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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[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

chevron_right


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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the shortest
// palindromic substring
#include <bits/stdc++.h>
using namespace std;
 
// Function return the shortest
// palindromic substring
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 = min(ans, s[i]);
    }
     
    return ans;
}
 
// Driver code
int main()
{
    string s = "geeksforgeeks";
     
    cout << ShortestPalindrome(s);
     
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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[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 code
public static void Main(String[] args)
{
    String s = "geeksforgeeks";
    Console.Write(ShortestPalindrome(s));
}
}
 
// This code is contributed by 29AjayKumar

chevron_right


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.

My Personal Notes arrow_drop_up
Recommended Articles
Page :