Longest Palindrome Within a String
Problem
Return any longest substring of s that reads the same forwards and backwards.
Input
s = "babad"Output
"bab" or "aba"Every palindrome has either an odd centre (one character) or an even centre (between two characters). Try all 2n − 1 centres and expand while characters match.
def longest_palindrome(s):
def expand(l, r):
while l >= 0 and r < len(s) and s[l] == s[r]:
l -= 1; r += 1
return l + 1, r - 1
best = (0, -1)
for i in range(len(s)):
for l, r in (expand(i, i), expand(i, i + 1)):
if r - l > best[1] - best[0]:
best = (l, r)
return s[best[0]:best[1] + 1]
function longestPalindrome(s) {
let bestL = 0, bestR = -1;
const expand = (l, r) => {
while (l >= 0 && r < s.length && s[l] === s[r]) { l--; r++; }
return [l + 1, r - 1];
};
for (let i = 0; i < s.length; i++) {
for (const [l, r] of [expand(i, i), expand(i, i + 1)]) {
if (r - l > bestR - bestL) { bestL = l; bestR = r; }
}
}
return s.slice(bestL, bestR + 1);
}
class Solution {
int bestL = 0, bestR = 0;
public String longestPalindrome(String s) {
for (int i = 0; i < s.length(); i++) {
expand(s, i, i);
expand(s, i, i + 1);
}
return s.substring(bestL, bestR + 1);
}
private void expand(String s, int l, int r) {
while (l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) { l--; r++; }
l++; r--;
if (r - l > bestR - bestL) { bestL = l; bestR = r; }
}
}
string longestPalindrome(string s) {
int bL = 0, bR = 0;
auto expand = [&](int l, int r) {
while (l >= 0 && r < (int) s.size() && s[l] == s[r]) { l--; r++; }
l++; r--;
if (r - l > bR - bL) { bL = l; bR = r; }
};
for (int i = 0; i < (int) s.size(); i++) { expand(i, i); expand(i, i + 1); }
return s.substr(bL, bR - bL + 1);
}