Skip to content

Commit 5797fc2

Browse files
committed
feat: add solutions to lc problem: No.0516. Longest Palindromic
Subsequence
1 parent cd45f03 commit 5797fc2

File tree

8 files changed

+258
-4
lines changed

8 files changed

+258
-4
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@
193193
- [不同路径 II](./solution/0000-0099/0063.Unique%20Paths%20II/README.md)
194194
- [最小路径和](./solution/0000-0099/0064.Minimum%20Path%20Sum/README.md)
195195
- [最长回文子串](./solution/0000-0099/0005.Longest%20Palindromic%20Substring/README.md)
196+
- [最长回文子序列](.solution/0500-0599/0516.Longest%20Palindromic%20Subsequence/README.md)
196197
- [礼物的最大价值](./lcof/面试题47.%20礼物的最大价值/README.md)
197198
- [最长上升子序列](./solution/0300-0399/0300.Longest%20Increasing%20Subsequence/README.md)
198199
- [俄罗斯套娃信封问题](./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README.md)

README_EN.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
187187
- [Unique Paths II](./solution/0000-0099/0063.Unique%20Paths%20II/README_EN.md)
188188
- [Minimum Path Sum](./solution/0000-0099/0064.Minimum%20Path%20Sum/README_EN.md)
189189
- [Longest Palindromic Substring](./solution/0000-0099/0005.Longest%20Palindromic%20Substring/README_EN.md)
190+
- [Longest Palindromic Subsequence](.solution/0500-0599/0516.Longest%20Palindromic%20Subsequence/README_EN.md)
190191
- [Longest Increasing Subsequence](./solution/0300-0399/0300.Longest%20Increasing%20Subsequence/README_EN.md)
191192
- [Russian Doll Envelopes](./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README_EN.md)
192193
- [Longest Common Subsequence](./solution/1100-1199/1143.Longest%20Common%20Subsequence/README_EN.md)

solution/0500-0599/0516.Longest Palindromic Subsequence/README.md

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,27 +45,118 @@
4545
<li><code>s</code> 只包含小写英文字母</li>
4646
</ul>
4747

48-
4948
## 解法
5049

5150
<!-- 这里可写通用的实现逻辑 -->
5251

52+
动态规划。
53+
54+
`dp[i][j]` 表示字符串 `s[i..j]` 中的最长回文子序列的长度。初始化 `dp[i][i] = 1`(`i∈[0, n-1]`)。
55+
56+
- 对于 `s[i] == s[j]``dp[i][j] = dp[i + 1][j - 1] + 2`
57+
- 对于 `s[i] != s[j]``dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])`
58+
5359
<!-- tabs:start -->
5460

5561
### **Python3**
5662

5763
<!-- 这里可写当前语言的特殊实现逻辑 -->
5864

5965
```python
60-
66+
class Solution:
67+
def longestPalindromeSubseq(self, s: str) -> int:
68+
n = len(s)
69+
dp = [[0] * n for _ in range(n)]
70+
for i in range(n):
71+
dp[i][i] = 1
72+
for j in range(1, n):
73+
for i in range(j - 1, -1, -1):
74+
if s[i] == s[j]:
75+
dp[i][j] = dp[i + 1][j - 1] + 2
76+
else:
77+
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
78+
return dp[0][-1]
6179
```
6280

6381
### **Java**
6482

6583
<!-- 这里可写当前语言的特殊实现逻辑 -->
6684

6785
```java
86+
class Solution {
87+
public int longestPalindromeSubseq(String s) {
88+
int n = s.length();
89+
int[][] dp = new int[n][n];
90+
for (int i = 0; i < n; ++i) {
91+
dp[i][i] = 1;
92+
}
93+
for (int j = 1; j < n; ++j) {
94+
for (int i = j - 1; i >= 0; --i) {
95+
if (s.charAt(i) == s.charAt(j)) {
96+
dp[i][j] = dp[i + 1][j - 1] + 2;
97+
} else {
98+
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
99+
}
100+
}
101+
}
102+
return dp[0][n - 1];
103+
}
104+
}
105+
```
106+
107+
### **C++**
108+
109+
```cpp
110+
class Solution {
111+
public:
112+
int longestPalindromeSubseq(string s) {
113+
int n = s.size();
114+
vector<vector<int>> dp(n, vector<int>(n, 0));
115+
for (int i = 0; i < n; ++i) {
116+
dp[i][i] = 1;
117+
}
118+
for (int j = 1; j < n; ++j) {
119+
for (int i = j - 1; i >= 0; --i) {
120+
if (s[i] == s[j]) {
121+
dp[i][j] = dp[i + 1][j - 1] + 2;
122+
} else {
123+
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
124+
}
125+
}
126+
}
127+
return dp[0][n - 1];
128+
}
129+
};
130+
```
68131
132+
### **Go**
133+
134+
```go
135+
func longestPalindromeSubseq(s string) int {
136+
n := len(s)
137+
dp := make([][]int, n)
138+
for i := 0; i < n; i++ {
139+
dp[i] = make([]int, n)
140+
dp[i][i] = 1
141+
}
142+
for j := 1; j < n; j++ {
143+
for i := j - 1; i >= 0; i-- {
144+
if s[i] == s[j] {
145+
dp[i][j] = dp[i+1][j-1] + 2
146+
} else {
147+
dp[i][j] = max(dp[i+1][j], dp[i][j-1])
148+
}
149+
}
150+
}
151+
return dp[0][n-1]
152+
}
153+
154+
func max(a, b int) int {
155+
if a > b {
156+
return a
157+
}
158+
return b
159+
}
69160
```
70161

71162
### **...**

solution/0500-0599/0516.Longest Palindromic Subsequence/README_EN.md

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,105 @@
3333
<li><code>s</code> consists only of lowercase English letters.</li>
3434
</ul>
3535

36-
3736
## Solutions
3837

3938
<!-- tabs:start -->
4039

4140
### **Python3**
4241

4342
```python
44-
43+
class Solution:
44+
def longestPalindromeSubseq(self, s: str) -> int:
45+
n = len(s)
46+
dp = [[0] * n for _ in range(n)]
47+
for i in range(n):
48+
dp[i][i] = 1
49+
for j in range(1, n):
50+
for i in range(j - 1, -1, -1):
51+
if s[i] == s[j]:
52+
dp[i][j] = dp[i + 1][j - 1] + 2
53+
else:
54+
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
55+
return dp[0][-1]
4556
```
4657

4758
### **Java**
4859

4960
```java
61+
class Solution {
62+
public int longestPalindromeSubseq(String s) {
63+
int n = s.length();
64+
int[][] dp = new int[n][n];
65+
for (int i = 0; i < n; ++i) {
66+
dp[i][i] = 1;
67+
}
68+
for (int j = 1; j < n; ++j) {
69+
for (int i = j - 1; i >= 0; --i) {
70+
if (s.charAt(i) == s.charAt(j)) {
71+
dp[i][j] = dp[i + 1][j - 1] + 2;
72+
} else {
73+
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
74+
}
75+
}
76+
}
77+
return dp[0][n - 1];
78+
}
79+
}
80+
```
81+
82+
### **C++**
83+
84+
```cpp
85+
class Solution {
86+
public:
87+
int longestPalindromeSubseq(string s) {
88+
int n = s.size();
89+
vector<vector<int>> dp(n, vector<int>(n, 0));
90+
for (int i = 0; i < n; ++i) {
91+
dp[i][i] = 1;
92+
}
93+
for (int j = 1; j < n; ++j) {
94+
for (int i = j - 1; i >= 0; --i) {
95+
if (s[i] == s[j]) {
96+
dp[i][j] = dp[i + 1][j - 1] + 2;
97+
} else {
98+
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
99+
}
100+
}
101+
}
102+
return dp[0][n - 1];
103+
}
104+
};
105+
```
50106
107+
### **Go**
108+
109+
```go
110+
func longestPalindromeSubseq(s string) int {
111+
n := len(s)
112+
dp := make([][]int, n)
113+
for i := 0; i < n; i++ {
114+
dp[i] = make([]int, n)
115+
dp[i][i] = 1
116+
}
117+
for j := 1; j < n; j++ {
118+
for i := j - 1; i >= 0; i-- {
119+
if s[i] == s[j] {
120+
dp[i][j] = dp[i+1][j-1] + 2
121+
} else {
122+
dp[i][j] = max(dp[i+1][j], dp[i][j-1])
123+
}
124+
}
125+
}
126+
return dp[0][n-1]
127+
}
128+
129+
func max(a, b int) int {
130+
if a > b {
131+
return a
132+
}
133+
return b
134+
}
51135
```
52136

53137
### **...**
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int longestPalindromeSubseq(string s) {
4+
int n = s.size();
5+
vector<vector<int>> dp(n, vector<int>(n, 0));
6+
for (int i = 0; i < n; ++i) {
7+
dp[i][i] = 1;
8+
}
9+
for (int j = 1; j < n; ++j) {
10+
for (int i = j - 1; i >= 0; --i) {
11+
if (s[i] == s[j]) {
12+
dp[i][j] = dp[i + 1][j - 1] + 2;
13+
} else {
14+
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
15+
}
16+
}
17+
}
18+
return dp[0][n - 1];
19+
}
20+
};
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
func longestPalindromeSubseq(s string) int {
2+
n := len(s)
3+
dp := make([][]int, n)
4+
for i := 0; i < n; i++ {
5+
dp[i] = make([]int, n)
6+
dp[i][i] = 1
7+
}
8+
for j := 1; j < n; j++ {
9+
for i := j - 1; i >= 0; i-- {
10+
if s[i] == s[j] {
11+
dp[i][j] = dp[i+1][j-1] + 2
12+
} else {
13+
dp[i][j] = max(dp[i+1][j], dp[i][j-1])
14+
}
15+
}
16+
}
17+
return dp[0][n-1]
18+
}
19+
20+
func max(a, b int) int {
21+
if a > b {
22+
return a
23+
}
24+
return b
25+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public int longestPalindromeSubseq(String s) {
3+
int n = s.length();
4+
int[][] dp = new int[n][n];
5+
for (int i = 0; i < n; ++i) {
6+
dp[i][i] = 1;
7+
}
8+
for (int j = 1; j < n; ++j) {
9+
for (int i = j - 1; i >= 0; --i) {
10+
if (s.charAt(i) == s.charAt(j)) {
11+
dp[i][j] = dp[i + 1][j - 1] + 2;
12+
} else {
13+
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
14+
}
15+
}
16+
}
17+
return dp[0][n - 1];
18+
}
19+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution:
2+
def longestPalindromeSubseq(self, s: str) -> int:
3+
n = len(s)
4+
dp = [[0] * n for _ in range(n)]
5+
for i in range(n):
6+
dp[i][i] = 1
7+
for j in range(1, n):
8+
for i in range(j - 1, -1, -1):
9+
if s[i] == s[j]:
10+
dp[i][j] = dp[i + 1][j - 1] + 2
11+
else:
12+
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
13+
return dp[0][-1]

0 commit comments

Comments
 (0)