string longestPalindrome(string s) {
auto isPal = [&](int l, int r) -> bool {
while (l < r) {
if (s[l] != s[r]) return false;
l++;
r--;
}
return true;
};
string best = "";
for (int i = 0; i < (int)s.size(); i++) {
for (int j = i; j < (int)s.size(); j++) {
if (j - i + 1 > (int)best.size() && isPal(i, j)) best = s.substr(i, j - i + 1);
}
}
return best;
}
public String longestPalindrome(String s) {
String best = "";
for (int i = 0; i < s.length(); i++) {
for (int j = i; j < s.length(); j++) {
if (j - i + 1 > best.length() && isPal(s, i, j)) best = s.substring(i, j + 1);
}
}
return best;
}
private boolean isPal(String s, int l, int r) {
while (l < r) {
if (s.charAt(l) != s.charAt(r)) return false;
l++;
r--;
}
return true;
}
def longest_palindrome(s):
def is_pal(l, r):
while l < r:
if s[l] != s[r]: return False
l += 1
r -= 1
return True
best = ''
for i in range(len(s)):
for j in range(i, len(s)):
if j - i + 1 > len(best) and is_pal(i, j): best = s[i:j + 1]
return best
function longestPalindrome(s: string): string {
const isPal = (l: number, r: number): boolean => {
while (l < r) {
if (s[l] !== s[r]) return false;
l++;
r--;
}
return true;
};
let best = '';
for (let i = 0; i < s.length; i++) {
for (let j = i; j < s.length; j++) {
if (j - i + 1 > best.length && isPal(i, j)) best = s.slice(i, j + 1);
}
}
return best;
}
string longestPalindrome(string s) {
int n = s.size();
vector<vector<bool>> dp(n, vector<bool>(n, false));
int start = 0, bestLen = 1;
for (int len = 1; len <= n; len++) {
for (int i = 0; i + len <= n; i++) {
int j = i + len - 1;
if (s[i] == s[j] && (len <= 2 || dp[i + 1][j - 1])) {
dp[i][j] = true;
if (len > bestLen) {
start = i;
bestLen = len;
}
}
}
}
return s.substr(start, bestLen);
}
public String longestPalindrome(String s) {
int n = s.length();
boolean[][] dp = new boolean[n][n];
int start = 0, bestLen = 1;
for (int len = 1; len <= n; len++) {
for (int i = 0; i + len <= n; i++) {
int j = i + len - 1;
if (s.charAt(i) == s.charAt(j) && (len <= 2 || dp[i + 1][j - 1])) {
dp[i][j] = true;
if (len > bestLen) {
start = i;
bestLen = len;
}
}
}
}
return s.substring(start, start + bestLen);
}
def longest_palindrome(s):
n = len(s)
dp = [[False] * n for _ in range(n)]
start, best_len = 0, 1
for length in range(1, n + 1):
for i in range(0, n - length + 1):
j = i + length - 1
if s[i] == s[j] and (length <= 2 or dp[i + 1][j - 1]):
dp[i][j] = True
if length > best_len:
start = i
best_len = length
return s[start:start + best_len]
function longestPalindrome(s: string): string {
const n = s.length;
const dp = Array.from({ length: n }, () => new Array<boolean>(n).fill(false));
let start = 0, bestLen = 1;
for (let len = 1; len <= n; len++) {
for (let i = 0; i + len <= n; i++) {
const j = i + len - 1;
if (s[i] === s[j] && (len <= 2 || dp[i + 1][j - 1])) {
dp[i][j] = true;
if (len > bestLen) {
start = i;
bestLen = len;
}
}
}
}
return s.slice(start, start + bestLen);
}
string longestPalindrome(string s) {
int start = 0, end = 0;
auto expand = [&](int l, int r) {
while (l >= 0 && r < (int)s.size() && s[l] == s[r]) {
if (r - l > end - start) {
start = l;
end = r;
}
l--;
r++;
}
};
for (int c = 0; c < (int)s.size(); c++) {
expand(c, c);
expand(c, c + 1);
}
return s.substr(start, end - start + 1);
}
public String longestPalindrome(String s) {
int[] range = {0, 0};
for (int c = 0; c < s.length(); c++) {
expand(s, c, c, range);
expand(s, c, c + 1, range);
}
return s.substring(range[0], range[1] + 1);
}
private void expand(String s, int l, int r, int[] range) {
while (l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) {
if (r - l > range[1] - range[0]) {
range[0] = l;
range[1] = r;
}
l--;
r++;
}
}
def longest_palindrome(s):
start = end = 0
def expand(l, r):
nonlocal start, end
while l >= 0 and r < len(s) and s[l] == s[r]:
if r - l > end - start:
start = l
end = r
l -= 1
r += 1
for c in range(len(s)):
expand(c, c)
expand(c, c + 1)
return s[start:end + 1]
function longestPalindrome(s: string): string {
let start = 0, end = 0;
const expand = (l: number, r: number): void => {
while (l >= 0 && r < s.length && s[l] === s[r]) {
if (r - l > end - start) {
start = l;
end = r;
}
l--;
r++;
}
};
for (let c = 0; c < s.length; c++) {
expand(c, c);
expand(c, c + 1);
}
return s.slice(start, end + 1);
}
string longestPalindrome(string s) {
string t = "^#"; for (char ch : s) { t += ch; t += '#'; } t += '$';
vector<int> p(t.size(), 0);
int center = 0, right = 0;
for (int i = 1; i < (int)t.size() - 1; i++) {
if (i < right) p[i] = min(right - i, p[2 * center - i]);
while (t[i + 1 + p[i]] == t[i - 1 - p[i]]) p[i]++;
if (i + p[i] > right) {
center = i;
right = i + p[i];
}
}
int bestLen = 0, bestCenter = 0;
for (int i = 1; i < (int)t.size() - 1; i++) {
if (p[i] > bestLen) {
bestLen = p[i];
bestCenter = i;
}
}
int start = (bestCenter - bestLen) / 2;
return s.substr(start, bestLen);
}
public String longestPalindrome(String s) {
StringBuilder tb = new StringBuilder("^#");
for (char ch : s.toCharArray()) tb.append(ch).append('#');
tb.append('$');
String t = tb.toString();
int[] p = new int[t.length()];
int center = 0, right = 0;
for (int i = 1; i < t.length() - 1; i++) {
if (i < right) p[i] = Math.min(right - i, p[2 * center - i]);
while (t.charAt(i + 1 + p[i]) == t.charAt(i - 1 - p[i])) p[i]++;
if (i + p[i] > right) {
center = i;
right = i + p[i];
}
}
int bestLen = 0, bestCenter = 0;
for (int i = 1; i < t.length() - 1; i++) {
if (p[i] > bestLen) {
bestLen = p[i];
bestCenter = i;
}
}
int start = (bestCenter - bestLen) / 2;
return s.substring(start, start + bestLen);
}
def longest_palindrome(s):
t = '^#' + '#'.join(s) + '#$'
p = [0] * len(t)
center = right = 0
for i in range(1, len(t) - 1):
if i < right: p[i] = min(right - i, p[2 * center - i])
while t[i + 1 + p[i]] == t[i - 1 - p[i]]: p[i] += 1
if i + p[i] > right:
center = i
right = i + p[i]
best_len = best_center = 0
for i in range(1, len(t) - 1):
if p[i] > best_len:
best_len = p[i]
best_center = i
start = (best_center - best_len) // 2
return s[start:start + best_len]
function longestPalindrome(s: string): string {
const t = '^#' + s.split('').join('#') + '#$';
const p = new Array<number>(t.length).fill(0);
let center = 0, right = 0;
for (let i = 1; i < t.length - 1; i++) {
if (i < right) p[i] = Math.min(right - i, p[2 * center - i]);
while (t[i + 1 + p[i]] === t[i - 1 - p[i]]) p[i]++;
if (i + p[i] > right) {
center = i;
right = i + p[i];
}
}
let bestLen = 0, bestCenter = 0;
for (let i = 1; i < t.length - 1; i++) {
if (p[i] > bestLen) {
bestLen = p[i];
bestCenter = i;
}
}
const start = (bestCenter - bestLen) >> 1;
return s.slice(start, start + bestLen);
}