版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目大意:输入一字符串,输出该字符串中最长回文串的长度。
运用DP,先将相邻1位、2位的字符判断是否回文,再从相隔三位开始,判断字符是否相同,若相同则根据之前的结果判断前字符的后一位与后字符的前一位是否相同,更新长度;
注意用cin直接输入s是不行的,遇到空格就结束了,要使用getline(cin, s);其次间隔的大小应该到s.length(),而不是小于。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int dp[1010][1010];
int main() {
string s;
int fin = 1;
getline(cin, s);
int l = s.length();
for (int i = 0; i < l; i++) {
dp[i][i] = 1;
fin = 1;
}
for (int i = 0; i < l-1; i++) {
if (s[i] == s[i + 1]) {
dp[i][i + 1] = 1;
fin = 2;
}
}
for (int u = 3; u <= l; u++) {
for (int i = 0; i + u - 1 < l; i++) {
if (s[i] == s[i + u - 1] && dp[i + 1][i + u - 2] == 1) {
dp[i][i + u - 1] = 1;
fin = u;
}
}
}
printf("%d", fin);
}