返回
致手速场怪物:我成功提交LeetCode周赛305第四题,你呢?
闲谈
2024-02-21 10:34:36
LeetCode周赛305如期而至,这次的题目可谓是简单粗暴,引得众人纷纷吐槽:“这简直就是手速场!”没错,第四题要求选手在短短几秒钟内提交代码,这对于绝大多数人来说简直就是天方夜谭。
但令人惊叹的是,竟然有足足两千多人通过了这道题,不得不让人感叹:手速场选手的恐怖之处。如果你还没有通过这道题,不要气馁,本文将为你揭秘解题思路,并提供Python和JavaScript代码示例,助你成功提交。
解题思路:
这道题的关键在于理解题意。题目要求找到一个字符串中的最长回文子串。最长回文子串是指从左到右读和从右到左读都一样的子串。
对于这道题,我们可以使用动态规划的方法来求解。具体步骤如下:
- 创建一个二维表格dp,其中dp[i][j]表示字符串s[i:j+1]是否是一个回文子串。
- 初始化dp表。对于所有i和j,如果s[i] == s[j],则dp[i][j]为True,否则为False。
- 对于长度为3的子串,如果s[i] == s[j],则dp[i][j]为True。
- 对于长度大于3的子串,如果dp[i+1][j-1]为True且s[i] == s[j],则dp[i][j]为True。
- 遍历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第四题。如果你还有任何问题,欢迎随时留言交流。