关键词:动态规划
核心思想:使用动态规划来计算最长回文子序列的长度。通过构建一个二维数组 dp,其中 dp[i][j] 表示字符串 str 从索引 i 到 j 的最长回文子序列的长度。
解题步骤:
- 初始化一个二维数组
dp,其大小为l x l(l为字符串长度),所有元素初始化为0。 - 对于每个单字符回文,设置
dp[i][i] = 1。 - 从后往前遍历字符串,填充
dp数组: - 如果
str[i] == str[j],则dp[i][j] = dp[i + 1][j - 1] + 2 - 否则
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]) - 最后,输出
dp[0][l - 1],即整个字符串的最长回文子序列长度。
时间和空间复杂度:时间复杂度:O(n²),因为有两重循环遍历字符串。空间复杂度:O(n²),用于存储DP表。
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
string str;
cin >> str;
int l = str.length();
vector< vector<int>> dp(l, vector<int>(l, 0));
// 从后往前处理字符串
for (int i = l - 1; i >= 0; i--) {
dp[i][i] = 1; // 单字符是长度为1的回文串
for (int j = i + 1; j < l; j++)
if (str[i] == str[j])
dp[i][j] = dp[i + 1][j - 1] + 2;
else
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
}
cout << dp[0][l - 1] << endl;
return 0;
}

京公网安备 11010502036488号