5. Longest Palindromic Substring
Given a string s, return the longest palindromicsubstring in s.
Example 1:
Input: s = "babad"
Output: "bab"
Explanation: "aba" is also a valid answer.
Example 2:
Input: s = "cbbd"
Output: "bb"
Constraints:
- 1 <= s.length <= 1000
- s consist of only digits and English letters.
From: LeetCode
Link: 5. Longest Palindromic Substring
Solution:
Ideas:
-
Expand Around Center: We'll create a helper function, expandFromCenter, to find the length of the palindrome by expanding around its center. This function will handle both odd and even length palindromes.
-
Iterate Over the String: For each character in the string, we'll use expandFromCenter to check for the longest palindrome centered at that character.
-
Update the Longest Palindrome: We'll keep track of the longest palindrome we've found so far.
-
Return the Longest Palindrome: We'll use dynamic memory allocation to create a substring for the longest palindrome and return it.
Code:
c
// Helper function to expand from the center and find palindrome length
int expandFromCenter(char* s, int left, int right) {
while (left >= 0 && right < strlen(s) && s[left] == s[right]) {
left--;
right++;
}
return right - left - 1;
}
char* longestPalindrome(char* s) {
if (s == NULL || strlen(s) < 1) return "";
int start = 0, end = 0;
for (int i = 0; i < strlen(s); i++) {
int len1 = expandFromCenter(s, i, i); // Odd length palindromes
int len2 = expandFromCenter(s, i, i + 1); // Even length palindromes
int len = len1 > len2 ? len1 : len2;
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
char* result = malloc(end - start + 2);
strncpy(result, s + start, end - start + 1);
result[end - start + 1] = '\0';
return result;
}