返回
初识 LeetCode,来挑战最长回文子串
闲谈
2023-09-05 08:11:30
初识 LeetCode
LeetCode 是一个著名的算法题学习和刷题平台,拥有海量的算法题库和详细的题解。它分为不同的难度等级,适合不同水平的学习者。LeetCode 的题库涵盖了计算机科学的各个领域,包括算法、数据结构、操作系统、数据库等。此外,LeetCode 还提供在线评测系统,可以帮助你检验自己的算法实现是否正确。
最长回文子串
最长回文子串是 LeetCode 上一道经典的算法题。给定一个字符串,要求找到最长的回文子串。回文子串是指正读和反读都相同的子串,例如 "abba" 和 "racecar"都是回文子串。
解题思路
这道题可以使用动态规划的方法来解决。首先,我们需要创建一个二维数组 dp
,其中 dp[i][j]
表示从字符串的第 i
个字符到第 j
个字符的最长回文子串的长度。然后,我们可以使用以下递推关系来计算 dp
数组:
dp[i][j] = 1,如果 i == j
dp[i][j] = dp[i+1][j-1] + 2,如果 s[i] == s[j] 且 i < j
dp[i][j] = max(dp[i+1][j], dp[i][j-1]),如果 s[i] != s[j] 且 i < j
其中,s
是给定的字符串。
代码实现
def longest_palindrome(s):
"""
Finds the longest palindrome in a given string.
Args:
s: The string to search.
Returns:
The longest palindrome in s.
"""
# Create a二维数组dp,其中dp[i][j]表示从字符串的第i个字符到第j个字符的最长回文子串的长度。
dp = [[0 for _ in range(len(s))] for _ in range(len(s))]
# Initialize the diagonal of dp to 1, since a single character is always a palindrome.
for i in range(len(s)):
dp[i][i] = 1
# Fill the rest of the dp array using the递推关系。
for i in range(len(s) - 1, -1, -1):
for j in range(i + 1, len(s)):
if s[i] == s[j]:
dp[i][j] = dp[i+1][j-1] + 2
else:
dp[i][j] = max(dp[i+1][j], dp[i][j-1])
# Find the starting index of the longest palindrome.
start = 0
for i in range(1, len(s)):
if dp[i][len(s) - 1] > dp[start][len(s) - 1]:
start = i
# Return the longest palindrome.
return s[start:start + dp[start][len(s) - 1]]
总结
最长回文子串是 LeetCode 上一道经典的算法题,可以使用动态规划的方法来解决。这道题不仅考验了算法实现能力,还考验了对算法思想的理解。希望本文对你有帮助,也希望你能够在 LeetCode 上取得好成绩。