返回

初识 LeetCode,来挑战最长回文子串

闲谈

初识 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 上取得好成绩。