💡 This approach improves efficiency by exploiting the palindrome property that it mirrors around its center, reducing redundant checks.
Intuition
Every palindrome can be expanded from its center. Check all centers (single characters and between characters) and expand outwards to find the longest palindrome.
Algorithm
- Iterate over each index as a potential palindrome center.
- Expand around the center for odd-length palindromes.
- Expand around the center and next index for even-length palindromes.
- Track the longest palindrome found during expansions.
- Return the longest palindrome substring.
💡 The dual expansion for odd and even length palindromes is key and can be tricky to implement correctly.
Recurrence:Not a classic DP recurrence but uses center expansion logic.
def longest_palindrome_expand(s: str) -> str:
if not s:
return ""
start, end = 0, 0
def expand_around_center(left, right):
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
return left + 1, right - 1
for i in range(len(s)):
l1, r1 = expand_around_center(i, i)
l2, r2 = expand_around_center(i, i + 1)
if r1 - l1 > end - start:
start, end = l1, r1
if r2 - l2 > end - start:
start, end = l2, r2
return s[start:end+1]
# Driver code
if __name__ == '__main__':
print(longest_palindrome_expand('babad')) # Expected: 'bab' or 'aba'
Line Notes
def expand_around_center(left, right):Helper to expand palindrome around given center indices
while left >= 0 and right < len(s) and s[left] == s[right]:Expand as long as characters match and indices valid
for i in range(len(s))Try every index as center for odd and even length palindromes
if r1 - l1 > end - start:Update longest palindrome if found longer odd-length palindrome
if r2 - l2 > end - start:Update longest palindrome if found longer even-length palindrome
return s[start:end+1]Return the longest palindrome substring found
public class Solution {
public static String longestPalindromeExpand(String s) {
if (s == null || s.length() < 1) return "";
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i);
int len2 = expandAroundCenter(s, i, i + 1);
int len = Math.max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
private static int expandAroundCenter(String s, int left, int right) {
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
return right - left - 1;
}
public static void main(String[] args) {
System.out.println(longestPalindromeExpand("babad")); // Expected: 'bab' or 'aba'
}
}
Line Notes
for (int i = 0; i < s.length(); i++)Iterate over each character as center
int len1 = expandAroundCenter(s, i, i);Check odd length palindrome
int len2 = expandAroundCenter(s, i, i + 1);Check even length palindrome
if (len > end - start)Update longest palindrome boundaries if longer found
#include <iostream>
#include <string>
using namespace std;
int expandAroundCenter(const string &s, int left, int right) {
while (left >= 0 && right < (int)s.size() && s[left] == s[right]) {
left--;
right++;
}
return right - left - 1;
}
string longestPalindromeExpand(const string &s) {
if (s.empty()) return "";
int start = 0, end = 0;
for (int i = 0; i < (int)s.size(); i++) {
int len1 = expandAroundCenter(s, i, i);
int len2 = expandAroundCenter(s, i, i + 1);
int len = max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substr(start, end - start + 1);
}
int main() {
cout << longestPalindromeExpand("babad") << endl; // Expected: 'bab' or 'aba'
return 0;
}
Line Notes
int expandAroundCenter(const string &s, int left, int right)Helper to expand palindrome from center indices
while (left >= 0 && right < (int)s.size() && s[left] == s[right])Expand while characters match and indices valid
for (int i = 0; i < (int)s.size(); i++)Try each index as center for odd and even palindromes
if (len > end - start)Update longest palindrome boundaries if longer palindrome found
function longestPalindromeExpand(s) {
if (!s) return "";
let start = 0, end = 0;
function expandAroundCenter(left, right) {
while (left >= 0 && right < s.length && s[left] === s[right]) {
left--;
right++;
}
return right - left - 1;
}
for (let i = 0; i < s.length; i++) {
let len1 = expandAroundCenter(i, i);
let len2 = expandAroundCenter(i, i + 1);
let len = Math.max(len1, len2);
if (len > end - start) {
start = i - Math.floor((len - 1) / 2);
end = i + Math.floor(len / 2);
}
}
return s.substring(start, end + 1);
}
console.log(longestPalindromeExpand('babad')); // Expected: 'bab' or 'aba'
Line Notes
function expandAroundCenter(left, right)Helper to expand palindrome around center indices
while (left >= 0 && right < s.length && s[left] === s[right])Expand while characters match and indices valid
for (let i = 0; i < s.length; i++)Try each index as center for odd and even palindromes
if (len > end - start)Update longest palindrome boundaries if longer palindrome found
Each center expansion takes O(n) and there are O(n) centers, totaling O(n^2).
💡 For n=20, about 400 expansions, which is efficient for typical interview constraints.
Interview Verdict: Accepted and efficient for medium-sized inputs
A practical and commonly accepted solution in interviews.