PAT A1040 Longest Symmetric String
思路:本题的状态转移方程为 dp[i][j] = dp[i + 1][j - 1] && s[i] = s[j],注意子串长度为2时特殊处理。
本题可以进行空间优化,代码如下。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int MAXN = 1005;
bool dp[MAXN][MAXN];
int main() {
string s;
getline(cin, s);
int n = s.size();
int ans = 1;
for(int i = n - 1; i >= 0; i--) {
dp[i][i] = true;
for(int j = i + 1; j < n; j++) {
dp[i][j] = (s[i] == s[j]) && (j - i < 2 || dp[i + 1][j - 1]);
if(dp[i][j] && j - i + 1 > ans) ans = j - i + 1;
}
}
cout << ans;
return 0;
}
// 空间优化
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int MAXN = 1005;
bool dp[MAXN];
int main() {
string s;
getline(cin, s);
int n = s.size();
int ans = 1;
for(int i = n - 1; i >= 0; i--) {
bool pre = false;
dp[i] = true;
for(int j = i + 1; j < n; j++) {
bool temp = dp[j];
dp[j] = (s[i] == s[j]) && (j - i < 2 || pre);
if(dp[j] && j - i + 1 > ans) ans = j - i + 1;
pre = temp;
}
}
cout << ans;
return 0;
}