s
, return the longest Example 1:
Input: s = "babad" Output: "bab" Explanation: "aba" is also a valid answer.
Example 2:
Input: s = "cbbd" Output: "bb"
JAVA
class Solution { public String longestPalindrome(String s) { if (s.isEmpty()) return ""; // [start, end] indices of the longest palindrome in s int[] indices = {0, 0}; for (int i = 0; i < s.length(); ++i) { int[] indices1 = extend(s, i, i); if (indices1[1] - indices1[0] > indices[1] - indices[0]) indices = indices1; if (i + 1 < s.length() && s.charAt(i) == s.charAt(i + 1)) { int[] indices2 = extend(s, i, i + 1); if (indices2[1] - indices2[0] > indices[1] - indices[0]) indices = indices2; } } return s.substring(indices[0], indices[1] + 1); } // Returns [start, end] indices of the longest palindrome extended from s[i..j] private int[] extend(final String s, int i, int j) { for (; i >= 0 && j < s.length(); --i, ++j) if (s.charAt(i) != s.charAt(j)) break; return new int[] {i + 1, j - 1}; } }
C++
class Solution {
public:
string longestPalindrome(string s) {
int N = s.size(), start = 0, len = 0;
bool dp[1001][1001] = {};
for (int i = N - 1; i >= 0; --i) {
for (int j = i; j < N; ++j) {
if (i == j) dp[i][j] = true;
else dp[i][j] = s[i] == s[j] && (i + 1 > j - 1 || dp[i + 1][j - 1]);
if (dp[i][j] && j - i + 1 > len) {
start = i;
len = j - i + 1;
}
}
}
return s.substr(start, len);
}
};
PYTHON
class Solution:
def longestPalindrome(self, s: str) -> str:
n = len(s)
dp = [[False] * n for _ in range(n)]
start, mx = 0, 1
for j in range(n):
for i in range(j + 1):
if j - i < 2:
dp[i][j] = s[i] == s[j]
else:
dp[i][j] = dp[i + 1][j - 1] and s[i] == s[j]
if dp[i][j] and mx < j - i + 1:
start, mx = i, j - i + 1
return s[start : start + mx]
JAVASCRIPT
var longestPalindrome = function (s) {
let maxLength = 0,
left = 0,
right = 0;
for (let i = 0; i < s.length; i++) {
let singleCharLength = getPalLenByCenterChar(s, i, i);
let doubleCharLength = getPalLenByCenterChar(s, i, i + 1);
let max = Math.max(singleCharLength, doubleCharLength);
if (max > maxLength) {
maxLength = max;
left = i - parseInt((max - 1) / 2);
right = i + parseInt(max / 2);
}
}
return s.slice(left, right + 1);
};
function getPalLenByCenterChar(s, left, right) {
if (s[left] != s[right]) {
return right - left;
}
while (left > 0 && right < s.length - 1) {
left--;
right++;
if (s[left] != s[right]) {
return right - left - 1;
}
}
return right - left + 1;
}