返回

AI巧破算法难关:《每日LeetCode打卡——73.最长回文串》

Android

踏破算法取最长!本文为您揭开LeetCode第73题《最长回文串》的答案,让您见证算法的魅力与高效。

算法精髓,解题妙方

回文串,顾名思义,正着读和倒着读都是一样的字符串。它们以其对称的美感和特殊的性质而著称。在LeetCode的第73题中,我们遇到了这样的难题:给定一个包含大写字母和小写字母的字符串,如何找到通过这些字母构造成的最长的回文串?

解决这个问题,我们需要用到动态规划的思想。动态规划是一种求解最优化问题的有效方法,它将问题分解成更小的子问题,并通过求解这些子问题来逐步解决原问题。

在解决《最长回文串》这一问题时,我们可以定义一个二维数组dp,其中dp[i][j]表示字符串s中从第i个字符到第j个字符构成的子字符串是否是回文串。我们可以通过以下步骤来求解dp数组:

  1. 初始化:对于所有i和j,如果i>=j,则dp[i][j]为True,因为空字符串和长度为1的字符串都是回文串。

  2. 递推:对于所有i<j,我们可以通过以下步骤求得dp[i][j]:

    • 如果s[i] == s[j],那么dp[i][j]为True,因为s[i]和s[j]是相同的,它们构成的子字符串也是回文串。
    • 如果s[i] != s[j],那么dp[i][j]为False,因为s[i]和s[j]是不同的,它们构成的子字符串不是回文串。
  3. 求解原问题:最长回文串的长度就是dp数组中最大值的长度。

程序设计,实现算法

有了算法精髓,我们就可以用程序设计来实现它。以下是Python代码的实现:

def longest_palindrome(s):
  """
  :type s: str
  :rtype: str
  """
  n = len(s)
  dp = [[False for _ in range(n)] for _ in range(n)]

  # 初始化
  for i in range(n):
    dp[i][i] = True

  # 递推
  for i in range(n-1,-1,-1):
    for j in range(i+1,n):
      if s[i] == s[j]:
        if j - i <= 2:
          dp[i][j] = True
        else:
          dp[i][j] = dp[i+1][j-1]

  # 求解原问题
  max_len = 0
  start = 0
  end = 0
  for i in range(n):
    for j in range(n):
      if dp[i][j] and j - i + 1 > max_len:
        max_len = j - i + 1
        start = i
        end = j

  return s[start:end+1]

print(longest_palindrome("cbbd"))

结语

《最长回文串》这一问题看似复杂,但通过算法的巧妙设计和程序的实现,我们可以轻松地找到问题的答案。希望这篇文章能够帮助您更好地理解算法的奥妙,并激发您对算法的兴趣。