Description

Given a string s, return the longest palindromic substring in s.

Example 1:

1
2
3
Input: s = "babad"
Output: "bab"
Explanation: "aba" is also a valid answer.

Example 2:
1
2
Input: s = "cbbd"
Output: "bb"

1
2
3
4
Constraints:

1 <= s.length <= 1000
s consist of only digits and English letters.

Approach: Expand Around Center

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution:
def longestPalindrome(self, s: str) -> str:
if not s or len(s) == 1:
return s

start, end = 0, 0

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

for i in range(len(s)):
l1, r1 = expand(i, i)
l2, r2 = expand(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]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution:
def longestPalindrome(self, s: str) -> str:
string = s
longest = ''
for i in range( len( string ) * 2 ):
i = i / 2
valid = True
a = int( ( i - 0.5 ) // 1 )
b = int( ( i + 1 ) // 1 )
stringnew = i % 1 == 0 and string[ int( i ) ] or ''
length = 0
while valid:
if a < 0 or b >= len( string ):
break
if string[ a ] != string[ b ]:
valid = False
break
stringnew = string[ a ] + stringnew + string[ b ]
a -= 1
b += 1
length += 1

if len( stringnew ) > len( longest ):
longest = stringnew
return longest
__import__("atexit").register(lambda: open("display_runtime.txt", 'w').write('0'))

Approach: Dynamic Programming

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def longestPalindrome(self, s: str) -> str:
n = len(s)
if n < 2:
return s

dp = [[False] * n for _ in range(n)]
start, max_len = 0, 1

for j in range(1, n):
for i in range(j):
if s[i] == s[j]:
if j - i < 3:
dp[i][j] = True
else:
dp[i][j] = dp[i + 1][j - 1]

if dp[i][j] and j - i + 1 > max_len:
max_len = j - i + 1
start = i

return s[start:start + max_len]