1 题目
求字符串的最长回文子序列长度
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the maximum length of s is 1000.
Example 1:
Input:
"bbbab"Output:
4One possible longest palindromic subsequence is "bbbb".
Example 2:
Input:
"cbbd"Output:
2One possible longest palindromic subsequence is "bb".
题目链接:点击打开链接
注意:子序列(subsequence)和子串(substring)含义不一样,子序列不要求连续,而子串要求
2 思路
f[i][j]保存字符串s[i...j]的最长回文子序列长度,初始化为0
从长度为1开始,枚举s[i...j]的最长回文子序列长度
len = 1,f[i][j] =1
状态转移方程:
如果s[i] == s[j], f[i][j] = max(f[i + 1][j], f[i][j - 1]);
否则 f[i][j] = f[i + 1][j - 1] + 2;
以s = "bbbab"为例
k = 1 就不详细列出了
k = 2
i | j | f |
0 | 1 | 2 |
1 | 2 | 2 |
2 | 3 | 1 |
3 | 4 | 1 |
k = 3
i | j | f |
0 | 2 | 3 |
1 | 3 | 2 |
2 | 4 | 3 |
k = 4
i | j | f |
0 | 3 | 3 |
1 | 4 | 3 |
k = 5
i | j | f |
0 | 4 | 4 |
最后结果是f[0][4] = 4
3 C++实现
class Solution {
public:
int longestPalindromeSubseq(string s) {
int n = s.length();
//f[i][j]保存字符串s[i...j]的最长回文子序列长度
int f[n][n] = {0};
for(int len = 1; len <= n; len++) {
//枚举长度为len的回文子序列
for(int i = 0; i + len <= n; i++) {
//s[i....j]
int j = i + len - 1;
//长度为1时,字符本身构成回文子序列,长度为1
if(len == 1)
f[i][j] = 1;
//字符串首尾相同
else if(s[i] == s[j])
f[i][j] = f[i + 1][j - 1] + 2;
//
else f[i][j] = max(f[i + 1][j], f[i][j - 1]);
}
}
return f[0][n - 1];
}
};