Dada una string, debe encontrar la substring palindrómica más corta de la string. Si hay varias respuestas, imprima la lexicográficamente más pequeña.
Ejemplos:
Input: zyzz Output:y Input: abab Output: a
Enfoque ingenuo:
- El enfoque es similar a encontrar la substring palindrómica más larga. Realizamos un seguimiento de las substrings de longitudes pares e impares y las guardamos en un vector.
- Después de eso, ordenaremos el vector e imprimiremos la substring lexicográficamente más pequeña. Esto también puede incluir substrings vacías, pero debemos ignorarlas.
A continuación se muestra la implementación del enfoque anterior:
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<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
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[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
<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>
Producción:
e
Complejidad temporal: O(N^2), donde N es la longitud de la string.
Enfoque eficiente:
- Una observación aquí es que un solo carácter también es un palíndromo. Entonces, solo necesitamos imprimir el carácter lexicográficamente más pequeño presente en la string.
A continuación se muestra la implementación del enfoque anterior:
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
<script> // Javascript program to find the shortest // palindromic subString // Function return the shortest // palindromic subString function 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 code let s = "geeksforgeeks"; document.write(ShortestPalindrome(s)); // This code is contributed by suresh07 </script>
Producción:
e
Complejidad temporal: O(N), donde N es la longitud de la string.
Publicación traducida automáticamente
Artículo escrito por mridulkumar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA