214. Shortest Palindrome
You are given a string s. You can convert s to a palindrome by adding characters in front of it.
Return the shortest palindrome you can find by performing this transformation.
Example 1:
Input: s = "aacecaaa"
Output: "aaacecaaa".
Example 2:
Input: s = "abcd"
Output: "dcbabcd"
Constraints:
- 0 < = s . l e n g t h < = 5 ∗ 1 0 4 0 <= s.length <= 5 * 10^4 0<=s.length<=5∗104
- s consists of lowercase English letters only.
From: LeetCode
Link: 214. Shortest Palindrome
Solution:
Ideas:
- Reverse the input string: This will help us find the longest palindromic prefix.
- Find the longest palindromic prefix: By comparing the original string with the suffixes of the reversed string, we determine the longest prefix of the original string that is also a suffix of the reversed string.
- Form the result string: Add the necessary characters (the part of the reversed string that does not match the prefix) in front of the original string to make it a palindrome.
Code:
c
void reverseString(char* str) {
int n = strlen(str);
for (int i = 0; i < n / 2; i++) {
char temp = str[i];
str[i] = str[n - i - 1];
str[n - i - 1] = temp;
}
}
char* shortestPalindrome(char* s) {
int n = strlen(s);
if (n == 0) return "";
// Create the reversed string
char* rev_s = (char*)malloc((n + 1) * sizeof(char));
strcpy(rev_s, s);
reverseString(rev_s);
// Find the longest palindromic prefix
int i;
for (i = n; i >= 0; i--) {
if (strncmp(s, rev_s + n - i, i) == 0) {
break;
}
}
// Build the shortest palindrome by adding the necessary characters in front of s
char* result = (char*)malloc((2 * n - i + 1) * sizeof(char));
strcpy(result, rev_s);
strncat(result, s + i, n - i);
// Free allocated memory
free(rev_s);
return result;
}