Ruka
2 min readMar 16, 2020

[LeetCode][python3]0005. Longest Palindromic Substring

Start the journey
N2I -2020.03.15

  1. My first try
class Solution:
def longestPalindrome(self, s: str) -> str:
if not s:
return ""
elif len(s)==1:
return s
l=1
r=-1
max_sub=0
for i in range(1,len(s)):
cur_l,cur_r=self.lgcheck(s,i)
if r-l-1<cur_r-cur_l-1:
l=cur_l
r=cur_r
return s[l+1:r]


def lgcheck(self,s,start):
start_l=start-1
start_r=start+1
while start_l>=0 and start_r<len(s):
if s[start_l]!=s[start_r]:
break
else:
start_l-=1
start_r+=1
cur_max=start_r-start_l-1
r=start_r
l=start_l

start_r=start
start_l=start-1
while start_l>=0 and start_r<len(s):
if s[start_l]!=s[start_r]:
break
else:
start_l-=1
start_r+=1
if cur_max<start_r-start_l-1:
r=start_r
l=start_l
N2I -2020.03.15

2. A better solution

class Solution:
def longestPalindrome(self, s: str) -> str:
str_len = len(s)
# if length of string < 2 or s is palindrome already
if str_len < 2 or s == s[::-1]:
return s
start, max_len = 0, 1for i in range(1, str_len):
odd_start = i - max_len - 1
even_start = i - max_len
odd = s[odd_start:i + 1] # len(odd) = max_len + 2
even = s[even_start:i + 1] # len(even) = max_len + 1
if odd_start >= 0 and odd == odd[::-1]:
start = odd_start
max_len += 2
elif even_start >= 0 and even == even[::-1]:
start = even_start
max_len += 1
return s[start:start + max_len]
N2I -2020.03.15

Note:

  • even[::-1] is the reverse array for even[:].
  • s[a::b] is a sub_array of s, a stands for the start index (default 0 or -1 when b<0), b stands for what length for a jump.
print("note for s[a::b]")
print("while a stants and b>0")
s=[0,1,2,3,4,5]
s[::1]
>>>[0,1,2,3,4,5]
s[1::]
>>>[1,2,3,4,5]
s[1::2]
>>>[1,3,5]
s[1::3]
>>>[1,4]
s[2::2]
>>>[2,4]
print("while a <len(s) and b<0")
s[::-1]
>>>[5,4,3,2,1,0]
s[::-2]
>>>[5,3,1]
s[-2::-2]
>>>[4,2,0]

Explanation:

This solution use even==even[::-1] to check the selecting area even=s[even_start,i+1]is palindrome or not. Since even or odd will always be 1 or 2 size longer then the current longest substring. start stands for the start of the current longest substring, will only changes when it finds a new longest one in odd or even.

N2I -2020.03.15

Ruka
Ruka

Written by Ruka

HI I’m Ruka. Now a SWE in Taiwan. Contact via email: nayzi9999@gmail.com

No responses yet