11# reference :https://www.geeksforgeeks.org/dsa/longest-palindromic-substring/
22
3- def longest_palindromic_substring (s :str )-> str :
3+
4+ def longest_palindromic_substring (s : str ) -> str :
45 """
56 This function returns longest palindromic substring in a string using DP
67 s : input string
@@ -15,34 +16,35 @@ def longest_palindromic_substring(s:str)->str:
1516 >>> longest_palindromic_substring("")
1617 ''
1718 """
18- n = len (s )
19+ n = len (s )
1920
20- dp = [[False for i in range (n )] for j in range (n )]
21- start = 0
22- max_length = 1
21+ dp = [[False for i in range (n )] for j in range (n )]
22+ start = 0
23+ max_length = 1
2324
2425 for i in range (n ):
25- dp [i ][i ]= True
26-
26+ dp [i ][i ] = True
27+
2728 # for length 2 palindrome check
28- for i in range (n - 1 ):
29- if s [i ]== s [i + 1 ]:
30- dp [i ][i + 1 ] = True
31- start = i
32- max_length = 2
29+ for i in range (n - 1 ):
30+ if s [i ] == s [i + 1 ]:
31+ dp [i ][i + 1 ] = True
32+ start = i
33+ max_length = 2
3334
3435 # for length 3 and above
35- for length in range (3 ,n + 1 ):
36- for i in range (n - length + 1 ):
37- j = i + length - 1
38- if s [i ]== s [j ] and dp [i + 1 ][j - 1 ]:
39- dp [i ][j ]= True
40- start = i
41- max_length = length
36+ for length in range (3 , n + 1 ):
37+ for i in range (n - length + 1 ):
38+ j = i + length - 1
39+ if s [i ] == s [j ] and dp [i + 1 ][j - 1 ]:
40+ dp [i ][j ] = True
41+ start = i
42+ max_length = length
4243
43- return s [start : start + max_length ]
44+ return s [start : start + max_length ]
4445
45- def manacher_algorithm (s :str )-> str :
46+
47+ def manacher_algorithm (s : str ) -> str :
4648 """
4749 This function returns the longest palindromic substring in a string using Manacher's algorithm
4850 >>> longest_palindromic_substring("babad")
@@ -56,27 +58,28 @@ def manacher_algorithm(s:str)->str:
5658 >>> longest_palindromic_substring("")
5759 ''
5860 """
59- T = '^#' + '#' .join (s )+ '#$'
60- n = len (T )
61+ T = "^#" + "#" .join (s ) + "#$"
62+ n = len (T )
63+
64+ p = [0 ] * n
65+ c = 0
66+ r = 0
6167
62- p = [0 ]* n
63- c = 0
64- r = 0
68+ for i in range (1 , n - 1 ):
69+ mirror = 2 * c - i
70+ if i < r :
71+ p [i ] = min (r - i , p [mirror ])
72+ while T [i + (1 + p [i ])] == T [i - (1 + p [i ])]:
73+ p [i ] += 1
74+ if i + p [i ] > r :
75+ c = i
76+ r = i + p [i ]
6577
66- for i in range (1 ,n - 1 ):
67- mirror = 2 * c - i
68- if i < r :
69- p [i ]= min (r - i ,p [mirror ])
70- while T [i + (1 + p [i ])]== T [i - (1 + p [i ])]:
71- p [i ]+= 1
72- if i + p [i ]> r :
73- c = i
74- r = i + p [i ]
78+ max_length = max (p )
79+ max_center = p .index (max_length )
80+ start = (max_center - max_length ) // 2
81+ return s [start : start + max_length ]
7582
76- max_length = max (p )
77- max_center = p .index (max_length )
78- start = (max_center - max_length )// 2
79- return s [start :start + max_length ]
8083
8184if __name__ == "__main__" :
8285 import doctest
0 commit comments