From dcf0061b81548dc7277e3481209e6d5594d8f300 Mon Sep 17 00:00:00 2001 From: "Ch.R.Bhardwaj" <131685680+RamachandraBhardwaj@users.noreply.github.com> Date: Sun, 5 Oct 2025 21:09:36 +0530 Subject: [PATCH 1/6] longest palindromic substring popular approaches of longest palindromic substring problem --- .../longest_palindromic_substring.py | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 dynamic_programming/longest_palindromic_substring.py diff --git a/dynamic_programming/longest_palindromic_substring.py b/dynamic_programming/longest_palindromic_substring.py new file mode 100644 index 000000000000..0815ccb45fe9 --- /dev/null +++ b/dynamic_programming/longest_palindromic_substring.py @@ -0,0 +1,83 @@ +# reference :https://www.geeksforgeeks.org/dsa/longest-palindromic-substring/ + +def longest_palindromic_substring(s:str)->str: + """ + This function returns the longest palindromic substring in a string using dynamic programming + >>> longest_palindromic_substring("babad") + 'aba' + >>> longest_palindromic_substring("cbbd") + 'bb' + >>> longest_palindromic_substring("a") + 'a' + >>> longest_palindromic_substring("ac") + 'a' + >>> longest_palindromic_substring("") + '' + """ + n=len(s) + + dp=[[False for i in range(n)] for j in range(n)] + start=0 + max_length=1 + + for i in range(n): + dp[i][i]=True + + # for length 2 palindrome check + for i in range(n-1): + if s[i]==s[i+1]: + dp[i][i+1]=True + start=i + max_length=2 + + # for length 3 and above + for length in range(3,n+1): + for i in range(n-length+1): + j=i+length-1 + if s[i]==s[j] and dp[i+1][j-1]: + dp[i][j]=True + start=i + max_length=length + + return s[start:start+max_length] + +def manacher_algorithm(s:str)->str: + """ + This function returns the longest palindromic substring in a string using Manacher's algorithm + >>> longest_palindromic_substring("babad") + 'aba' + >>> longest_palindromic_substring("cbbd") + 'bb' + >>> longest_palindromic_substring("a") + 'a' + >>> longest_palindromic_substring("ac") + 'a' + >>> longest_palindromic_substring("") + '' + """ + T='^#'+'#'.join(s)+'#$' + n=len(T) + + p=[0]*n + c=0 + r=0 + + for i in range(1,n-1): + mirror=2*c-i + if ir: + c=i + r=i+p[i] + + max_length=max(p) + max_center=p.index(max_length) + start=(max_center-max_length)//2 + return s[start:start+max_length] + +if __name__ == "__main__": + import doctest + + doctest.testmod() From 1a90d4573bcc9ae52213f0090c512a9a515c6db9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 5 Oct 2025 15:41:40 +0000 Subject: [PATCH 2/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../longest_palindromic_substring.py | 81 ++++++++++--------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/dynamic_programming/longest_palindromic_substring.py b/dynamic_programming/longest_palindromic_substring.py index 0815ccb45fe9..ff0ac67f0587 100644 --- a/dynamic_programming/longest_palindromic_substring.py +++ b/dynamic_programming/longest_palindromic_substring.py @@ -1,6 +1,7 @@ # reference :https://www.geeksforgeeks.org/dsa/longest-palindromic-substring/ -def longest_palindromic_substring(s:str)->str: + +def longest_palindromic_substring(s: str) -> str: """ This function returns the longest palindromic substring in a string using dynamic programming >>> longest_palindromic_substring("babad") @@ -14,34 +15,35 @@ def longest_palindromic_substring(s:str)->str: >>> longest_palindromic_substring("") '' """ - n=len(s) + n = len(s) - dp=[[False for i in range(n)] for j in range(n)] - start=0 - max_length=1 + dp = [[False for i in range(n)] for j in range(n)] + start = 0 + max_length = 1 for i in range(n): - dp[i][i]=True - + dp[i][i] = True + # for length 2 palindrome check - for i in range(n-1): - if s[i]==s[i+1]: - dp[i][i+1]=True - start=i - max_length=2 + for i in range(n - 1): + if s[i] == s[i + 1]: + dp[i][i + 1] = True + start = i + max_length = 2 # for length 3 and above - for length in range(3,n+1): - for i in range(n-length+1): - j=i+length-1 - if s[i]==s[j] and dp[i+1][j-1]: - dp[i][j]=True - start=i - max_length=length + for length in range(3, n + 1): + for i in range(n - length + 1): + j = i + length - 1 + if s[i] == s[j] and dp[i + 1][j - 1]: + dp[i][j] = True + start = i + max_length = length - return s[start:start+max_length] + return s[start : start + max_length] -def manacher_algorithm(s:str)->str: + +def manacher_algorithm(s: str) -> str: """ This function returns the longest palindromic substring in a string using Manacher's algorithm >>> longest_palindromic_substring("babad") @@ -55,27 +57,28 @@ def manacher_algorithm(s:str)->str: >>> longest_palindromic_substring("") '' """ - T='^#'+'#'.join(s)+'#$' - n=len(T) + T = "^#" + "#".join(s) + "#$" + n = len(T) + + p = [0] * n + c = 0 + r = 0 - p=[0]*n - c=0 - r=0 + for i in range(1, n - 1): + mirror = 2 * c - i + if i < r: + p[i] = min(r - i, p[mirror]) + while T[i + (1 + p[i])] == T[i - (1 + p[i])]: + p[i] += 1 + if i + p[i] > r: + c = i + r = i + p[i] - for i in range(1,n-1): - mirror=2*c-i - if ir: - c=i - r=i+p[i] + max_length = max(p) + max_center = p.index(max_length) + start = (max_center - max_length) // 2 + return s[start : start + max_length] - max_length=max(p) - max_center=p.index(max_length) - start=(max_center-max_length)//2 - return s[start:start+max_length] if __name__ == "__main__": import doctest From f1fec69ac2b6e8ec831ff3d6b976a391373bb4ed Mon Sep 17 00:00:00 2001 From: "Ch.R.Bhardwaj" <131685680+RamachandraBhardwaj@users.noreply.github.com> Date: Mon, 6 Oct 2025 10:03:26 +0530 Subject: [PATCH 3/6] new fixes --- .../longest_palindromic_substring.py | 84 +++++++++---------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/dynamic_programming/longest_palindromic_substring.py b/dynamic_programming/longest_palindromic_substring.py index ff0ac67f0587..a9db2dcf5835 100644 --- a/dynamic_programming/longest_palindromic_substring.py +++ b/dynamic_programming/longest_palindromic_substring.py @@ -1,9 +1,9 @@ # reference :https://www.geeksforgeeks.org/dsa/longest-palindromic-substring/ - -def longest_palindromic_substring(s: str) -> str: +def longest_palindromic_substring(s:str)->str: """ - This function returns the longest palindromic substring in a string using dynamic programming + This function returns longest palindromic substring in a string using DP + s : input string >>> longest_palindromic_substring("babad") 'aba' >>> longest_palindromic_substring("cbbd") @@ -15,35 +15,34 @@ def longest_palindromic_substring(s: str) -> str: >>> longest_palindromic_substring("") '' """ - n = len(s) + n=len(s) - dp = [[False for i in range(n)] for j in range(n)] - start = 0 - max_length = 1 + dp=[[False for i in range(n)] for j in range(n)] + start=0 + max_length=1 for i in range(n): - dp[i][i] = True - + dp[i][i]=True + # for length 2 palindrome check - for i in range(n - 1): - if s[i] == s[i + 1]: - dp[i][i + 1] = True - start = i - max_length = 2 + for i in range(n-1): + if s[i]==s[i+1]: + dp[i][i+1]=True + start=i + max_length=2 # for length 3 and above - for length in range(3, n + 1): - for i in range(n - length + 1): - j = i + length - 1 - if s[i] == s[j] and dp[i + 1][j - 1]: - dp[i][j] = True - start = i - max_length = length + for length in range(3,n+1): + for i in range(n-length+1): + j=i+length-1 + if s[i]==s[j] and dp[i+1][j-1]: + dp[i][j]=True + start=i + max_length=length - return s[start : start + max_length] + return s[start:start+max_length] - -def manacher_algorithm(s: str) -> str: +def manacher_algorithm(s:str)->str: """ This function returns the longest palindromic substring in a string using Manacher's algorithm >>> longest_palindromic_substring("babad") @@ -57,28 +56,27 @@ def manacher_algorithm(s: str) -> str: >>> longest_palindromic_substring("") '' """ - T = "^#" + "#".join(s) + "#$" - n = len(T) - - p = [0] * n - c = 0 - r = 0 + T='^#'+'#'.join(s)+'#$' + n=len(T) - for i in range(1, n - 1): - mirror = 2 * c - i - if i < r: - p[i] = min(r - i, p[mirror]) - while T[i + (1 + p[i])] == T[i - (1 + p[i])]: - p[i] += 1 - if i + p[i] > r: - c = i - r = i + p[i] + p=[0]*n + c=0 + r=0 - max_length = max(p) - max_center = p.index(max_length) - start = (max_center - max_length) // 2 - return s[start : start + max_length] + for i in range(1,n-1): + mirror=2*c-i + if ir: + c=i + r=i+p[i] + max_length=max(p) + max_center=p.index(max_length) + start=(max_center-max_length)//2 + return s[start:start+max_length] if __name__ == "__main__": import doctest From f6c1ace3bc1eab9991ae9a9a5a67f6d13c64651d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 04:33:45 +0000 Subject: [PATCH 4/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../longest_palindromic_substring.py | 81 ++++++++++--------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/dynamic_programming/longest_palindromic_substring.py b/dynamic_programming/longest_palindromic_substring.py index a9db2dcf5835..a181d17c279a 100644 --- a/dynamic_programming/longest_palindromic_substring.py +++ b/dynamic_programming/longest_palindromic_substring.py @@ -1,6 +1,7 @@ # reference :https://www.geeksforgeeks.org/dsa/longest-palindromic-substring/ -def longest_palindromic_substring(s:str)->str: + +def longest_palindromic_substring(s: str) -> str: """ This function returns longest palindromic substring in a string using DP s : input string @@ -15,34 +16,35 @@ def longest_palindromic_substring(s:str)->str: >>> longest_palindromic_substring("") '' """ - n=len(s) + n = len(s) - dp=[[False for i in range(n)] for j in range(n)] - start=0 - max_length=1 + dp = [[False for i in range(n)] for j in range(n)] + start = 0 + max_length = 1 for i in range(n): - dp[i][i]=True - + dp[i][i] = True + # for length 2 palindrome check - for i in range(n-1): - if s[i]==s[i+1]: - dp[i][i+1]=True - start=i - max_length=2 + for i in range(n - 1): + if s[i] == s[i + 1]: + dp[i][i + 1] = True + start = i + max_length = 2 # for length 3 and above - for length in range(3,n+1): - for i in range(n-length+1): - j=i+length-1 - if s[i]==s[j] and dp[i+1][j-1]: - dp[i][j]=True - start=i - max_length=length + for length in range(3, n + 1): + for i in range(n - length + 1): + j = i + length - 1 + if s[i] == s[j] and dp[i + 1][j - 1]: + dp[i][j] = True + start = i + max_length = length - return s[start:start+max_length] + return s[start : start + max_length] -def manacher_algorithm(s:str)->str: + +def manacher_algorithm(s: str) -> str: """ This function returns the longest palindromic substring in a string using Manacher's algorithm >>> longest_palindromic_substring("babad") @@ -56,27 +58,28 @@ def manacher_algorithm(s:str)->str: >>> longest_palindromic_substring("") '' """ - T='^#'+'#'.join(s)+'#$' - n=len(T) + T = "^#" + "#".join(s) + "#$" + n = len(T) + + p = [0] * n + c = 0 + r = 0 - p=[0]*n - c=0 - r=0 + for i in range(1, n - 1): + mirror = 2 * c - i + if i < r: + p[i] = min(r - i, p[mirror]) + while T[i + (1 + p[i])] == T[i - (1 + p[i])]: + p[i] += 1 + if i + p[i] > r: + c = i + r = i + p[i] - for i in range(1,n-1): - mirror=2*c-i - if ir: - c=i - r=i+p[i] + max_length = max(p) + max_center = p.index(max_length) + start = (max_center - max_length) // 2 + return s[start : start + max_length] - max_length=max(p) - max_center=p.index(max_length) - start=(max_center-max_length)//2 - return s[start:start+max_length] if __name__ == "__main__": import doctest From 0db3f495327f6d06c35f1be9d18d06a4e673f45d Mon Sep 17 00:00:00 2001 From: "Ch.R.Bhardwaj" <131685680+RamachandraBhardwaj@users.noreply.github.com> Date: Mon, 6 Oct 2025 10:08:30 +0530 Subject: [PATCH 5/6] Refactor longest_palindromic_substring function --- .../longest_palindromic_substring.py | 95 ++++++++++--------- 1 file changed, 51 insertions(+), 44 deletions(-) diff --git a/dynamic_programming/longest_palindromic_substring.py b/dynamic_programming/longest_palindromic_substring.py index a181d17c279a..b53335c55ee6 100644 --- a/dynamic_programming/longest_palindromic_substring.py +++ b/dynamic_programming/longest_palindromic_substring.py @@ -1,9 +1,10 @@ # reference :https://www.geeksforgeeks.org/dsa/longest-palindromic-substring/ - -def longest_palindromic_substring(s: str) -> str: +def longest_palindromic_substring(s:str)->str: """ - This function returns longest palindromic substring in a string using DP + This function returns longest palindromic substring in a string + using Dynamic Programming. + s : input string >>> longest_palindromic_substring("babad") 'aba' @@ -16,37 +17,44 @@ def longest_palindromic_substring(s: str) -> str: >>> longest_palindromic_substring("") '' """ - n = len(s) + n=len(s) - dp = [[False for i in range(n)] for j in range(n)] - start = 0 - max_length = 1 + dp=[[False for i in range(n)] for j in range(n)] + start=0 + max_length=1 for i in range(n): - dp[i][i] = True - + dp[i][i]=True # for length 2 palindrome check - for i in range(n - 1): - if s[i] == s[i + 1]: - dp[i][i + 1] = True - start = i - max_length = 2 + for i in range(n-1): + if s[i]==s[i+1]: + dp[i][i+1]=True + start=i + max_length=2 # for length 3 and above - for length in range(3, n + 1): - for i in range(n - length + 1): - j = i + length - 1 - if s[i] == s[j] and dp[i + 1][j - 1]: - dp[i][j] = True - start = i - max_length = length - - return s[start : start + max_length] + for length in range(3,n+1): + for i in range(n-length+1): + j=i+length-1 + if s[i]==s[j] and dp[i+1][j-1]: + dp[i][j]=True + start=i + max_length=length + return s[start:start+max_length] -def manacher_algorithm(s: str) -> str: +def manacher_algorithm(s:str)->str: """ - This function returns the longest palindromic substring in a string using Manacher's algorithm + This function returns the longest palindromic substring in a string + using Manacher's algorithm. + + s : input string + t : transformed string + p : array to store length of palindrome radius around each center + c : center of the current rightmost palindrome + r : right edge of the current rightmost palindrome + n : length of transformed string + >>> longest_palindromic_substring("babad") 'aba' >>> longest_palindromic_substring("cbbd") @@ -58,28 +66,27 @@ def manacher_algorithm(s: str) -> str: >>> longest_palindromic_substring("") '' """ - T = "^#" + "#".join(s) + "#$" - n = len(T) - - p = [0] * n - c = 0 - r = 0 + t='^#'+'#'.join(s)+'#$' + n=len(t) - for i in range(1, n - 1): - mirror = 2 * c - i - if i < r: - p[i] = min(r - i, p[mirror]) - while T[i + (1 + p[i])] == T[i - (1 + p[i])]: - p[i] += 1 - if i + p[i] > r: - c = i - r = i + p[i] + p=[0]*n + c=0 + r=0 - max_length = max(p) - max_center = p.index(max_length) - start = (max_center - max_length) // 2 - return s[start : start + max_length] + for i in range(1,n-1): + mirror=2*c-i + if ir: + c=i + r=i+p[i] + max_length=max(p) + max_center=p.index(max_length) + start=(max_center-max_length)//2 + return s[start:start+max_length] if __name__ == "__main__": import doctest From 6773a1fd9d4b188662042cf9686666582dcea046 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 04:38:48 +0000 Subject: [PATCH 6/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../longest_palindromic_substring.py | 89 ++++++++++--------- 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/dynamic_programming/longest_palindromic_substring.py b/dynamic_programming/longest_palindromic_substring.py index b53335c55ee6..adfb00036799 100644 --- a/dynamic_programming/longest_palindromic_substring.py +++ b/dynamic_programming/longest_palindromic_substring.py @@ -1,6 +1,7 @@ # reference :https://www.geeksforgeeks.org/dsa/longest-palindromic-substring/ -def longest_palindromic_substring(s:str)->str: + +def longest_palindromic_substring(s: str) -> str: """ This function returns longest palindromic substring in a string using Dynamic Programming. @@ -17,35 +18,36 @@ def longest_palindromic_substring(s:str)->str: >>> longest_palindromic_substring("") '' """ - n=len(s) + n = len(s) - dp=[[False for i in range(n)] for j in range(n)] - start=0 - max_length=1 + dp = [[False for i in range(n)] for j in range(n)] + start = 0 + max_length = 1 for i in range(n): - dp[i][i]=True + dp[i][i] = True # for length 2 palindrome check - for i in range(n-1): - if s[i]==s[i+1]: - dp[i][i+1]=True - start=i - max_length=2 + for i in range(n - 1): + if s[i] == s[i + 1]: + dp[i][i + 1] = True + start = i + max_length = 2 # for length 3 and above - for length in range(3,n+1): - for i in range(n-length+1): - j=i+length-1 - if s[i]==s[j] and dp[i+1][j-1]: - dp[i][j]=True - start=i - max_length=length + for length in range(3, n + 1): + for i in range(n - length + 1): + j = i + length - 1 + if s[i] == s[j] and dp[i + 1][j - 1]: + dp[i][j] = True + start = i + max_length = length + + return s[start : start + max_length] - return s[start:start+max_length] -def manacher_algorithm(s:str)->str: +def manacher_algorithm(s: str) -> str: """ - This function returns the longest palindromic substring in a string + This function returns the longest palindromic substring in a string using Manacher's algorithm. s : input string @@ -54,7 +56,7 @@ def manacher_algorithm(s:str)->str: c : center of the current rightmost palindrome r : right edge of the current rightmost palindrome n : length of transformed string - + >>> longest_palindromic_substring("babad") 'aba' >>> longest_palindromic_substring("cbbd") @@ -66,27 +68,28 @@ def manacher_algorithm(s:str)->str: >>> longest_palindromic_substring("") '' """ - t='^#'+'#'.join(s)+'#$' - n=len(t) - - p=[0]*n - c=0 - r=0 - - for i in range(1,n-1): - mirror=2*c-i - if ir: - c=i - r=i+p[i] - - max_length=max(p) - max_center=p.index(max_length) - start=(max_center-max_length)//2 - return s[start:start+max_length] + t = "^#" + "#".join(s) + "#$" + n = len(t) + + p = [0] * n + c = 0 + r = 0 + + for i in range(1, n - 1): + mirror = 2 * c - i + if i < r: + p[i] = min(r - i, p[mirror]) + while t[i + (1 + p[i])] == t[i - (1 + p[i])]: + p[i] += 1 + if i + p[i] > r: + c = i + r = i + p[i] + + max_length = max(p) + max_center = p.index(max_length) + start = (max_center - max_length) // 2 + return s[start : start + max_length] + if __name__ == "__main__": import doctest