返回

致手速场怪物:我成功提交LeetCode周赛305第四题,你呢?

闲谈

LeetCode周赛305如期而至,这次的题目可谓是简单粗暴,引得众人纷纷吐槽:“这简直就是手速场!”没错,第四题要求选手在短短几秒钟内提交代码,这对于绝大多数人来说简直就是天方夜谭。

但令人惊叹的是,竟然有足足两千多人通过了这道题,不得不让人感叹:手速场选手的恐怖之处。如果你还没有通过这道题,不要气馁,本文将为你揭秘解题思路,并提供Python和JavaScript代码示例,助你成功提交。

解题思路:

这道题的关键在于理解题意。题目要求找到一个字符串中的最长回文子串。最长回文子串是指从左到右读和从右到左读都一样的子串。

对于这道题,我们可以使用动态规划的方法来求解。具体步骤如下:

  1. 创建一个二维表格dp,其中dp[i][j]表示字符串s[i:j+1]是否是一个回文子串。
  2. 初始化dp表。对于所有i和j,如果s[i] == s[j],则dp[i][j]为True,否则为False。
  3. 对于长度为3的子串,如果s[i] == s[j],则dp[i][j]为True。
  4. 对于长度大于3的子串,如果dp[i+1][j-1]为True且s[i] == s[j],则dp[i][j]为True。
  5. 遍历dp表,找到dp[i][j]为True且长度最长的子串。

Python代码:

def longest_palindrome(s):
    n = len(s)
    dp = [[False] * n for _ in range(n)]

    for i in range(n):
        dp[i][i] = True

    max_length = 1
    start = 0

    for i in range(n - 1):
        if s[i] == s[i + 1]:
            dp[i][i + 1] = True
            max_length = 2
            start = i

    for k in range(3, n + 1):
        for i in range(n - k + 1):
            j = i + k - 1
            if s[i] == s[j] and dp[i + 1][j - 1]:
                dp[i][j] = True
                if k > max_length:
                    max_length = k
                    start = i

    return s[start:start + max_length]

JavaScript代码:

function longestPalindrome(s) {
  const n = s.length;
  const dp = new Array(n).fill(0).map(() => new Array(n).fill(false));

  for (let i = 0; i < n; i++) {
    dp[i][i] = true;
  }

  let maxLen = 1;
  let start = 0;

  for (let i = n - 1; i >= 0; i--) {
    for (let j = i + 1; j < n; j++) {
      if (s[i] === s[j]) {
        if (j - i <= 2) {
          dp[i][j] = true;
        } else {
          dp[i][j] = dp[i + 1][j - 1];
        }

        if (dp[i][j] && j - i + 1 > maxLen) {
          maxLen = j - i + 1;
          start = i;
        }
      }
    }
  }

  return s.substring(start, start + maxLen);
}

希望本文能帮助你成功通过LeetCode周赛305第四题。如果你还有任何问题,欢迎随时留言交流。