11# reference :https://www.geeksforgeeks.org/dsa/longest-palindromic-substring/
22
3-
4- def longest_palindromic_substring (s : str ) -> str :
3+ def longest_palindromic_substring (s :str )-> str :
54 """
6- This function returns the longest palindromic substring in a string using dynamic programming
5+ This function returns longest palindromic substring in a string using DP
6+ s : input string
77 >>> longest_palindromic_substring("babad")
88 'aba'
99 >>> longest_palindromic_substring("cbbd")
@@ -15,35 +15,34 @@ def longest_palindromic_substring(s: str) -> str:
1515 >>> longest_palindromic_substring("")
1616 ''
1717 """
18- n = len (s )
18+ n = len (s )
1919
20- dp = [[False for i in range (n )] for j in range (n )]
21- start = 0
22- max_length = 1
20+ dp = [[False for i in range (n )] for j in range (n )]
21+ start = 0
22+ max_length = 1
2323
2424 for i in range (n ):
25- dp [i ][i ] = True
26-
25+ dp [i ][i ]= True
26+
2727 # 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
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
3333
3434 # 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
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
4242
43- return s [start : start + max_length ]
43+ return s [start : start + max_length ]
4444
45-
46- def manacher_algorithm (s : str ) -> str :
45+ def manacher_algorithm (s :str )-> str :
4746 """
4847 This function returns the longest palindromic substring in a string using Manacher's algorithm
4948 >>> longest_palindromic_substring("babad")
@@ -57,28 +56,27 @@ def manacher_algorithm(s: str) -> str:
5756 >>> longest_palindromic_substring("")
5857 ''
5958 """
60- T = "^#" + "#" .join (s ) + "#$"
61- n = len (T )
62-
63- p = [0 ] * n
64- c = 0
65- r = 0
59+ T = '^#' + '#' .join (s )+ '#$'
60+ n = len (T )
6661
67- for i in range (1 , n - 1 ):
68- mirror = 2 * c - i
69- if i < r :
70- p [i ] = min (r - i , p [mirror ])
71- while T [i + (1 + p [i ])] == T [i - (1 + p [i ])]:
72- p [i ] += 1
73- if i + p [i ] > r :
74- c = i
75- r = i + p [i ]
62+ p = [0 ]* n
63+ c = 0
64+ r = 0
7665
77- max_length = max (p )
78- max_center = p .index (max_length )
79- start = (max_center - max_length ) // 2
80- return s [start : start + max_length ]
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 ]
8175
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 ]
8280
8381if __name__ == "__main__" :
8482 import doctest
0 commit comments