Given a string s
, return the longest palindromic substring in s
.
Example 1:
Input: s = "babad" Output: "bab" Note: "aba" is also a valid answer.
Example 2:
Input: s = "cbbd" Output: "bb"
Example 3:
Input: s = "a" Output: "a"
Example 4:
Input: s = "ac" Output: "a"
Constraints:
1 <= s.length <= 1000
s
consist of only digits and English letters (lower-case and/or upper-case),
Dynamic programming.
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]
class Solution {
public String longestPalindrome(String s) {
int n = s.length();
boolean[][] dp = new boolean[n][n];
int mx = 1, start = 0;
for (int j = 0; j < n; ++j) {
for (int i = 0; i <= j; ++i) {
if (j - i < 2) {
dp[i][j] = s.charAt(i) == s.charAt(j);
} else {
dp[i][j] = dp[i + 1][j - 1] && s.charAt(i) == s.charAt(j);
}
if (dp[i][j] && mx < j - i + 1) {
mx = j - i + 1;
start = i;
}
}
}
return s.substring(start, start + mx);
}
}
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
vector<vector<bool>> dp(n, vector<bool>(n, false));
int start = 0, mx = 1;
for (int j = 0; j < n; ++j) {
for (int i = 0; i <= j; ++i) {
if (j - i < 2) {
dp[i][j] = s[i] == s[j];
} else {
dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j];
}
if (dp[i][j] && mx < j - i + 1) {
start = i;
mx = j - i + 1;
}
}
}
return s.substr(start, mx);
}
};
func longestPalindrome(s string) string {
n := len(s)
dp := make([][]bool, n)
for i := 0; i < n; i++ {
dp[i] = make([]bool, n)
}
mx, start := 1, 0
for j := 0; j < n; j++ {
for i := 0; i <= j; i++ {
if j-i < 2 {
dp[i][j] = s[i] == s[j]
} else {
dp[i][j] = dp[i+1][j-1] && s[i] == s[j]
}
if dp[i][j] && mx < j-i+1 {
mx, start = j-i+1, i
}
}
}
return s[start : start+mx]
}
public class Solution{
public string LongestPalindrome(string s) {
int n = s.Length;
bool[,] dp = new bool[n, n];
int mx = 1, start = 0;
for (int j = 0; j < n; ++j)
{
for (int i = 0; i <= j; ++i)
{
if (j - i < 2)
{
dp[i, j] = s[i] == s[j];
}
else
{
dp[i, j] = dp[i + 1, j - 1] && s[i] == s[j];
}
if (dp[i, j] && mx < j - i + 1)
{
mx = j - i + 1;
start = i;
}
}
}
return s.Substring(start, mx);
}
}
import std/sequtils
proc longestPalindrome(s: string): string =
let n: int = s.len()
var
dp = newSeqWith[bool](n, newSeqWith[bool](n, false))
start: int = 0
mx: int = 1
for j in 0 ..< n:
for i in 0 .. j:
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 = i
mx = j - i + 1
result = s[start ..< start+mx]