Shortest Palindromic Substring (original) (raw)
Last Updated : 29 Dec, 2022
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 <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;}
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 anss = "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 v = new List();
// 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
JavaScript
`
Time Complexity: O(N^2), where N is the length of the string.
Auxiliary Space: O(N^2)
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 <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;}
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[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
JavaScript
`
Time Complexity: O(N), where N is the length of the string.
Auxiliary Space: O(1), no extra space is required, so it is a constant.