Skip to content

Commit dcf0061

Browse files
longest palindromic substring
popular approaches of longest palindromic substring problem
1 parent a71618f commit dcf0061

1 file changed

Lines changed: 83 additions & 0 deletions

File tree

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# reference :https://www.geeksforgeeks.org/dsa/longest-palindromic-substring/
2+
3+
def longest_palindromic_substring(s:str)->str:
4+
"""
5+
This function returns the longest palindromic substring in a string using dynamic programming
6+
>>> longest_palindromic_substring("babad")
7+
'aba'
8+
>>> longest_palindromic_substring("cbbd")
9+
'bb'
10+
>>> longest_palindromic_substring("a")
11+
'a'
12+
>>> longest_palindromic_substring("ac")
13+
'a'
14+
>>> longest_palindromic_substring("")
15+
''
16+
"""
17+
n=len(s)
18+
19+
dp=[[False for i in range(n)] for j in range(n)]
20+
start=0
21+
max_length=1
22+
23+
for i in range(n):
24+
dp[i][i]=True
25+
26+
# for length 2 palindrome check
27+
for i in range(n-1):
28+
if s[i]==s[i+1]:
29+
dp[i][i+1]=True
30+
start=i
31+
max_length=2
32+
33+
# for length 3 and above
34+
for length in range(3,n+1):
35+
for i in range(n-length+1):
36+
j=i+length-1
37+
if s[i]==s[j] and dp[i+1][j-1]:
38+
dp[i][j]=True
39+
start=i
40+
max_length=length
41+
42+
return s[start:start+max_length]
43+
44+
def manacher_algorithm(s:str)->str:
45+
"""
46+
This function returns the longest palindromic substring in a string using Manacher's algorithm
47+
>>> longest_palindromic_substring("babad")
48+
'aba'
49+
>>> longest_palindromic_substring("cbbd")
50+
'bb'
51+
>>> longest_palindromic_substring("a")
52+
'a'
53+
>>> longest_palindromic_substring("ac")
54+
'a'
55+
>>> longest_palindromic_substring("")
56+
''
57+
"""
58+
T='^#'+'#'.join(s)+'#$'
59+
n=len(T)
60+
61+
p=[0]*n
62+
c=0
63+
r=0
64+
65+
for i in range(1,n-1):
66+
mirror=2*c-i
67+
if i<r:
68+
p[i]=min(r-i,p[mirror])
69+
while T[i+(1+p[i])]==T[i-(1+p[i])]:
70+
p[i]+=1
71+
if i+p[i]>r:
72+
c=i
73+
r=i+p[i]
74+
75+
max_length=max(p)
76+
max_center=p.index(max_length)
77+
start=(max_center-max_length)//2
78+
return s[start:start+max_length]
79+
80+
if __name__ == "__main__":
81+
import doctest
82+
83+
doctest.testmod()

0 commit comments

Comments
 (0)