-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
381a168
commit a7a8dd8
Showing
15 changed files
with
136 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
--- | ||
id: 516-longest-palindrome-subseq | ||
title: 最长回文子序列 | ||
sidebar_label: 516. 最长回文子序列 | ||
keywords: | ||
- Dynamic Programming | ||
--- | ||
|
||
:::success Tips | ||
题目类型: Dynamic Programming | ||
|
||
相关题目: | ||
|
||
- [10. 正则表达式匹配](/leetcode/hard/10-is-match) | ||
- [44. 通配符匹配](/leetcode/hard/44-is-match) | ||
- [72. 编辑距离](/leetcode/hard/72-min-distance) | ||
- [115. 不同的子序列](/leetcode/hard/115-num-distinct) | ||
- [583. 两个字符串的删除操作](/leetcode/medium/583-min-distance) | ||
- [1143. 最长公共子序列](/leetcode/medium/1143-longest-common-subsequence) | ||
|
||
::: | ||
|
||
## 题目 | ||
|
||
给你一个字符串 `s`, 找出其中最长的回文子序列, 并返回该序列的长度. | ||
|
||
子序列定义为: 不改变剩余字符顺序的情况下, 删除某些字符或者不删除任何字符形成的一个序列. | ||
|
||
:::note 提示: | ||
|
||
- `1 <= s.length <= 1000` | ||
- `s` 仅由数字和英文字母组成 | ||
|
||
::: | ||
|
||
:::info 示例 | ||
|
||
```ts | ||
输入: s = "bbbab" | ||
输出: 4 | ||
解释: 一个可能的最长回文子序列为 "bbbb" | ||
``` | ||
|
||
```ts | ||
输入: s = "cbbd" | ||
输出: 2 | ||
解释: 一个可能的最长回文子序列为 "bb" | ||
``` | ||
|
||
::: | ||
|
||
## 题解 | ||
|
||
对于一个子序列而言, 如果它是回文子序列, 并且长度大于 2, 那么将它首尾的两个字符去除之后, 它仍然是个回文子序列. | ||
|
||
```ts | ||
/** | ||
* @param {string} s | ||
* @return {number} | ||
*/ | ||
var longestPalindromeSubseq = function (s) { | ||
const n = s.length | ||
const dp = new Array(n + 1).fill(0).map(() => new Array(n + 1).fill(0)) | ||
|
||
// 反着遍历保证正确的状态转移 | ||
for (let i = n - 1; i >= 0; i--) { | ||
// 如果只有一个字符, 一定是回文 | ||
dp[i][i] = 1 | ||
|
||
const char1 = s[i] | ||
for (let j = i + 1; j < n; j++) { | ||
const char2 = s[j] | ||
if (char1 === char2) { | ||
dp[i][j] = dp[i + 1][j - 1] + 2 | ||
} else { | ||
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]) | ||
} | ||
} | ||
} | ||
|
||
return dp[0][n - 1] | ||
} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -81,5 +81,5 @@ var generateTrees = function (n) { | |
|
||
## 复杂度分析 | ||
|
||
- 时间复杂度:卡特兰数 | ||
- 时间复杂度: 卡特兰数 | ||
- 空间复杂度: 卡特兰数 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
/* | ||
* @lc app=leetcode.cn id=516 lang=javascript | ||
* | ||
* [516] 最长回文子序列 | ||
*/ | ||
|
||
// @lc code=start | ||
/** | ||
* @param {string} s | ||
* @return {number} | ||
*/ | ||
var longestPalindromeSubseq = function (s) { | ||
const n = s.length | ||
const dp = new Array(n + 1).fill(0).map(() => new Array(n + 1).fill(0)) | ||
|
||
for (let i = n - 1; i >= 0; i--) { | ||
dp[i][i] = 1 | ||
const char1 = s[i] | ||
for (let j = i + 1; j < n; j++) { | ||
const char2 = s[j] | ||
if (char1 === char2) { | ||
dp[i][j] = dp[i + 1][j - 1] + 2 | ||
} else { | ||
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]) | ||
} | ||
} | ||
} | ||
|
||
return dp[0][n - 1] | ||
} | ||
// @lc code=end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
pub fn foo() -> () {} |